
比赛题解
文章平均质量分 62
sophilex
Every day,Every moment
展开
-
一道推起来很爽的组合优化题
莫比乌斯反演+欧拉反演原创 2024-04-02 11:48:00 · 982 阅读 · 0 评论 -
Petrozavodsk Winter 2023. Day 1 部分题解
尝试将i的映射变成j,我们需要验证i->j的权值贡献加上图的其他部分的贡献与ans相同。那么将i连向其他点的权值置为0,再将其他点连向j的权值置为0,重新跑一遍KM,加上i到j的权值贡献,即可。第一个值其实比较好维护,我们只需要记录每一个人的分数,然后每一次操作的时候维护一下排名,贡献就是排名的变化了,具体实现用一个树状数组T1来维护分数。但是下一次又轮到id操作的时候,它并不是从一开始就待在当前的now这个位置的,所以我们先提前减去T2(now),下一次就可以放心加上对应的值了,实现起来也比较容易。原创 2023-07-08 16:00:55 · 375 阅读 · 0 评论 -
cf1750E Bracket Cost
假定L>=R,对于每一个没有匹配的左括号,如果我们能找到一个尚未匹配的右括号,则它一定在该左括号的前面,所以我们直接取以它们为端点的字串,执行操作1,这就实现了一个匹配。如果这个左括号找不到尚未匹配的右括号,我们就直接执行操作2即可。注意到每次操作都不会浪费,都达到了对应操作所能消去的最多的括号数,所以该操作是最优的,此时总操作次数是L-x。,L+R的求和是比较简单的,就是类似于上一个的求法,考虑每一个位置的贡献。我们令L表示串内左括号的数量,R表示右括号的数量,x表示串内已经匹配的括号对的数量。原创 2023-05-26 22:14:33 · 955 阅读 · 0 评论 -
妙妙子树上好题 XOR, Tree, and Queries
每一个连通块内,我们从任意一个起点出发(不妨假设它的pi值为0,这当然是合理的,因为想要修改它为x的话,我们只要让连通块内的点的p值都异或上x就可以了),可以推出其余点的p值,然后,如果里面有环,并且发现某一个点从不同路径走有不同值时,意味着该情况无解,这题就结束了。如果某一个连通块的大小是偶数,意味着我们要修改的值x会异或上偶数次,相当于没有操作。所以,看起来是一道很伤脑筋的构造题,其实最后的结果只有三种情况:无解,0,一个常值。所以我们把所有度数为1的节点找出来,它们的异或和,就是我们的答案。原创 2023-03-16 11:33:42 · 627 阅读 · 0 评论 -
Codeforces Round 857 (Div. 2) 题解
我们就需要维护从1走到n的过程中的卖艺收入最多的点,中间更新的时候就直接拿该点的权值除一下就好了。枚举到第i个位置的时候,对于第i个数组的每一个元素j,我们看一下前面i-1个数组丢弃掉一些之后,在最大值不大于j的情况下,最大贡献是多少,然后我们再加上j到该数组结束能产生的贡献,就可以更新到第i个数组位置的最大值了。然后我们枚举放在第一堆的最大值,枚举到第i个物品的话,假设当前第一堆的最大值是ai,i+1~n的位置都只能选第二个价值,1~i-1的位置就可以选第一个价值,也可以选第二个价值。原创 2023-03-15 17:49:03 · 923 阅读 · 0 评论 -
Codeforces Round 843 (Div. 2) VP题解
如果当前的数字a大于0,我们至少要a次--操作,那么我们就留给了后面的第一个数字a次++操作,同时也会消耗掉之前的数字留给我们的a次--操作。那么在这个过程中,如果需要的次数不够了,我们就直接加,因为这就是我们不得不额外做的操作。对于一个正数来说,如果某一次操作能让他--,我们肯定会做,如果是让他++,我们肯定不会做,这是显然的,因为这里不会有比直接减更好的策略,毕竟我们每次操作改变的值是固定的。如果没有,就可以构造。选出一个子序列,将奇数位 +1,偶数位 −1,或将奇数位 −1,偶数位 +1。原创 2023-03-08 16:37:20 · 560 阅读 · 0 评论 -
Educational Codeforces Round 143 (Rated for Div. 2) 题解
如果能向上走的话(父亲没有需要走的步数),就是将父亲的所需步数更新为该点所需步数-1.注意,一个父亲只能让一个儿子踩一遍,第二个儿子再过来就不能走了。hj原创 2023-02-21 21:34:24 · 614 阅读 · 0 评论 -
cf851 E. Sum Over Zero
仔细观察一下,在更新的时候,其实i是固定的,变的是dp[j]-j,所以我们可以想办法找到i之前的前缀和比当前小的点的前缀最大值。那么就可以令si从小到大作为id,来维护一个前缀最大的树状数组,因为我们是按1-n的顺序更新的,所以查询的时候树状数组里的最大值就是刚好满足条件的最大值。注意一点,一开始我们的树状数组肯定初始化为-inf,但是对于一个前缀和>0的点来说,它前面没有可以更新的前缀最大值,但是它可以直接从开始算一个。可以选,dp[i]=max{dp[j]+i-j},1原创 2023-02-13 21:24:33 · 475 阅读 · 0 评论 -
ABC 289 G - Shopping in AtCoder store 数学推导+凸包
我们将ci表示成x,那么原本要求的值 max{j*(bj+ci)}(1原创 2023-02-13 19:01:00 · 1010 阅读 · 5 评论 -
AtCoder Beginner Contest 289 题解
更进一步,在不改变横坐标的情况下,如果连续两次选择的点的纵坐标相差=1,那么最后的实际效果是纵坐标变化=2,这是改变的最小差值。一张简单图,每一个点有一个颜色(1或0),两个点从分别从1和n出发,同时走下一步,且两者下一步的颜色必须不同,问能否实现分别到达n和1.如果可以,求最小步数。因为如果我们只改变纵坐标的话,第一次选(a,c),第二次选(a,c+1),可以发现横坐标会回到原位。规则如下,每次在一个选定区域内选择一个坐标均为整数的点C,移动到关于点C对称的点。初始状态是(1,n),最终状态是(n,1)原创 2023-02-12 11:01:29 · 1134 阅读 · 0 评论 -
AtCoder Beginner Contest 288 题解
按照一开始讲的思路,从i=l~r-k+1,以i为左端点执行一次使其值为0的操作,那么这样之后除了最后k个元素,其余元素都为0,考虑到条件为所有sum[i]都相等,一番操作之后最后k的元素也必然相等,再执行一次操作就可以了。从第二步转移到第三步的时候,我们发现,当j=i-1时,j+1>i-1,X[j+1:i-1]是非法的,所以我们直接略去这种情况,那么此时第二步展开的前半部分就等于10*dp[i-1]了,那么我们就可以O(1)转移了。对于一个遍历到的物品,我们的选择是买或者不买,以及要买的话,什么时候买。原创 2023-02-08 16:20:15 · 719 阅读 · 0 评论 -
atcoder beginner contest 230 F - Predilection
首先,如果考虑对于一个数组的任意位置进行的变换都不会相同的话,那么自己手推几次就可以发现dp[i](共i个元素的数组的变换总结果数)=dp[i-1]*2;接下来考虑两个变换可能相同的情况,那也就是中间的一段的和为0,那么这个0往左结合和往右结合的效果是一样的,那么就要减掉对应的情况数了。...原创 2022-06-12 20:48:56 · 189 阅读 · 0 评论 -
Codeforces Round #803 (Div. 2) VP补题
D. Fixed Point Guessing大意:有一个1-n的升序排序,从中选n-1/2对不相交的数字进行交换,会有一个数字是没有动的。操作过后会得到一个最终序列。交互问题。每次询问l,r,返回最终序列的l到r元素的升序排列15个问题内找到没有改变位置的元素思路:做倒是做出来了,只是过程有点艰辛。。。(又是读不懂题的一天n的范围有1e4那么大,但是只能问15个问题,差不多就是1/log的级别,那么自然就可以想到二分.每次处理一个区间的话,就可以将区间分成两个部分,不妨先查左半部分,如果左半部分没问题,原创 2022-06-30 13:19:33 · 188 阅读 · 2 评论 -
E1. Numerical Sequence (easy version)
url看这里大意:给定一个序列:112123123412345...序列的规律能看出来,这里也不细说了。长度小于1e9,多次询问,每次问序列的第k给数字是什么。思路:我一开始想着找出每一个数字的规律,事实上它们确实有规律可循,我也确实找到了每一个数字对应的通项,但是我一直没写对,改天再试试。有一种二阶前缀和的思路:a【】表示每一个数字对应字符串的长度,比如a[12378]=5;b【】就表示前a给数字的总长度,b是a的前缀和c是b的前缀和,表示的就是1,12,123原创 2022-04-26 20:13:29 · 408 阅读 · 0 评论 -
CF1475F Unusual Matrix
Unusual Matrix - 洛谷大意:给你两个 n×n 的01矩阵,你可以进行如下两种操作:垂直xor:选中一列,将这一列的每个元素分别进行xor 水平xor:选中一行,将这一行的每个元素分别进行xora 矩阵是否可以经过有限次操作变为 b思路:填坑...原创 2022-05-09 21:47:48 · 249 阅读 · 0 评论 -
AtCoder Beginner Contest 243E Edge Deletion
题目链接大意:给定一张图,统计可删的边的总数,一条边当且仅当其对图的联通性和任意两点的最短路无影响时可以被删去。思路:大概会去往flyod方向上靠,因为这肯定是要求多源最短路的。大部分情况应该都是ok的,只要先建完一张最短路图,然后对于每一条边,只要它大于对应两条边的最短路,那么它就一定可以被删去。但是还有一个问题,就是当这条边的权值和其对应两点的最短路一样长时,得分为两种情况1:最短路就是这条边自身,那么它肯定是不能删的。2.它对构成另一条最短路无贡献,那么它就是可以删的。原创 2022-03-16 20:28:55 · 341 阅读 · 0 评论 -
[JSOI2008]最大数MAXNUMBER
ST表/线段树大意:m次操作1.查询后l个数当中的最大值2.上一次查询的结果加上指定数并取模加到数组的后面思路:ST表 裸的。f[i][j]查询i后面2^j个数中的最大值数组动态更新。线段树:改一下板子,把查询最后l个数的最大值改为查询【n-l+1,n】的区间最大值。注意数组开够即可。ST表code:#include<bits/stdc++.h>using namespace std;#define ll long longconst ll N原创 2022-03-04 18:29:38 · 210 阅读 · 0 评论 -
牛客练习赛95C:Division
对于每一个数,要将其不断除2变成1,应该要进行log2(n)次处理,所以就不用再考虑原数组,而是另外建一个数组来存它所需要的操作次数。每次对该数组进行差分,不妨从i到n开始遍历,每次遇到已经减为0的元素就跳过,否则,找到之后的最大的j满足mas[j]>mas[j-1],来保证在mas[j-1]减完之后才轮到mas[j],从而使我们的操作具备从左往右一次遍历的合理性(为什么不是mas[j]>=mas[j-1]?因为在mas【j】之前mas【j-1】已经减过一次了,如果此时仍要满足mas[j]>=mas[原创 2022-01-21 10:31:30 · 5751 阅读 · 0 评论 -
Yet Another Palindrome Partitioning
url大意:把一个字符串s分割成m个串,这m个串满足至多有一种字符出现次数为奇数次,其他均为偶数次,问m的最小值思路:一开始看错了题意,以为是可以任意重排字符串,然后刷刷敲完之后死活过不去。。。字符串顺序是不能改变的。那么这里可以用一个状压的思路。用f[i](1到26的一个01串对应的大小)来代表从1到i的每一个字母的数量(奇数为1,偶数为0)则区间[l, r]可以加一个子串,就是a[l]^a[r]的值必须为2的幂次(也就是中间只有一个奇数次数的字母)。然后用dp来对每一个状态原创 2022-05-28 21:54:30 · 135 阅读 · 0 评论 -
abc255 E - Lucky Numbers
推一推就可以发现这个好序列其实局限性很大,只要你确定了序列中的一个元素,整个好序列就都确定了。如果构造一个数列B满足:那么:a1+a2=s1---->a2=s1-a1;a2+a3=s2---->a3=s2-a2=s2-s1+a1;a3+a4=s3---->a4=s3-a3=s3-s2+s1-a1;...那么就可以大概得到一些结论了:......原创 2022-06-13 20:22:57 · 291 阅读 · 0 评论 -
牛客多校1 C Grab the Seat!
首先,对于每一个有人的位置,它能覆盖的区域就是它与讲台两点的连线对应的在他背后的区域(红色斜线部分),对于每一个点都做出这样一个区域之后,我们就得到了一个完整的覆盖区域,我们的目标自然就是描绘出它的边缘(图中黑线),那么每一行黑线之前的点(图中绿点)就是ok的部分。仔细观察的话不难发现,如果我们只考虑斜向上的斜线的话,从下到上它们的斜率是依次增大的,而对于每一行,一个斜率大的斜线肯定会覆盖斜率小的斜线,所以我们只需要动态维护从(0,1)点出发的最大斜率即可,每次更新最值。别的也没了,这题也并不是很难~...原创 2022-07-19 13:24:07 · 173 阅读 · 0 评论 -
Codeforces Round #767 (Div. 2) Meximum Array
maxium array题意给定一个 a 序列,当 a 非空时可以选择从 a 中切出前 k 个数字(有才行),这 k 个数字取一个最小的且不存在于该非负序列中的数字,得出来的结果加给 b 序列,要求构造出的 b 序列满足字典序尽可能大思路:要让字典序尽可能大,所以我们要让每一位的数字尽可能的大,且让数位尽可能多,可以贪心,同时数组应该尽可能全部用完。标记一个cnt记录数字出现的次数,顺序遍历时,每次不断更新当前已经出现过的数,直到更新结果无法保持连续时,那么空出来的那个数字就是我们应该要原创 2022-01-24 11:44:14 · 374 阅读 · 0 评论 -
AtCoder Regular Contest 142
A题不用说,C题之后不会。。。B - Unbalanced Squares大意:构造一个n阶矩阵(元素从1~n^2),对于矩阵中的每一个元素,它周围的元素中大于它的数目和小于它的数目不能相等。思路:想了二十多分钟才有的思路。。。脑子是越来越不行了。我的思路:如果直接按从小到大的顺序做矩阵的话:1 2 3 45 6 7 89 10 11 1213 14 15 16很明显是不行的。但是仔细观察一下,如果对每一行的元素改变一下顺序的话,可能是有希望的(总比全部重新构造好)。第一行和最后一行的每一个元素都是满足条原创 2022-06-20 12:49:13 · 366 阅读 · 0 评论 -
CF582A GCD Table
GCD table大意:对于一个长度为n的数列,定义它的GCD Table G是一张n×n的表,其中G[i][j]=gcd(a[i],a[j]),现在乱序给出G中所有数,求原数列a。思路:gcd(a,b)<=min(a,b),也就是说,两个数的gcd一定是不大于其中任意一个的,换句话说,在我们得到的表中,最大的数一定是原数组的一个元素。那么我们当然可以把它加入答案之中。接下来我们就得把它对其余数的影响去掉,也就是每次这样的操作过后,我们都得遍历答案数组,把答案中已有的数与该数的gcd原创 2022-05-12 21:15:31 · 202 阅读 · 0 评论 -
CF1043B Lost Array
不难看出a数组对应的差分数组就是答案之一,且其长度与原数组相同,并且其余的答案(假设长度为len)满足:1.一定是差分数组的一个子序列 2.差分数组每隔len个长度的元素值一定相同,换句话说,它是差分数组的一个周期,那么我们要做的其实就是找到差分数组有多少个周期数据量不大,可以暴力枚举每一个周期长度,然后一个一个元素对比看它是否满足条件,时间复杂度n^2.原创 2022-05-09 23:41:38 · 174 阅读 · 0 评论 -
【总结向】个人赛补题 POJ - 3041 Asteroids &CodeForces - 173B Chamber of Secrets
urlPOJ - 3041 Asteroids大意:N×N (1≤N≤500) 的网格,其中有 K (1≤K≤10000) 颗小行星。每次能够发射一道光束,将某行或者某列上的所有小行星轰成灰烬。希望发射的光束数量尽可能少。问发射的光束最少数量是多少?思路:没想到时那么那么那么裸的二分图匹配。。。一直没有想到将每一个点的列和行作为二部图的两个顶点。如果想到了这个的话,那其实就是要求一个图的最小覆盖,也就是最大匹配了。然后匈牙利算法套板子即可。(有匈牙利谁还要写dinic。。原创 2022-05-29 20:18:41 · 120 阅读 · 0 评论 -
CF894C Marco and GCD Sequence
那么求出总体的gcd,并将每一个元素都除以这个gcd,如果现在序列中出现了1,就说明集合中的元素都能被一个属于该集合的元素整除,那么我们只要在每一个元素的前面插入一个公共gcd作为原序列就可以了。如果操作后没有1,那就说明大家的公共gcd不在这个集合里,那这个集合就是无解的了。原创 2022-06-02 18:28:35 · 150 阅读 · 0 评论 -
CF567C Geometric Progression
看这里大意:求数组中长度为3且以k为公比的等比数列个数思路:一眼就是dp的感觉。。。但是元素范围有一丢丢大,数组肯定是开不下的,所以用map枚举中间的那个数字a,那么这个数对答案的贡献就应该是它前面的a/k的个数(前提是a%k==0)*它后面的a*k的个数这样累加即可还有一些小trick见代码:#include<bits/stdc++.h>using namespace std;#define ll long longll n,k;ll mas原创 2022-05-09 19:08:25 · 237 阅读 · 0 评论 -
AtCoder Beginner Contest 252(dijkstra,逆向思维)
E - Road Reduction大意:给定一张简单无向图。求任意一颗生成树,使得从点1到其他所有点的距离之和最小思路:在生成树中,1到任意点的距离肯定大于等于原图中1到该点的距离。所以,如果两个距离相等,那就是最优解。换句话说,对于每一个点,找到能使他到1点距离最小的边都应该是保留的。如果再仔细想一想,就会发现在这一条路径上的所有点,它们对应的也应该是原图中的最短路径。那么就很简单了,跑一遍dijkstra,对每一个点的dis值被更新时,记录对应的边的id,最后遍历输出即可。因为每一个点被更新时对应原创 2022-06-20 15:36:41 · 389 阅读 · 0 评论 -
一道(我以为是推柿子的)计数dp 牛客寒假集训 阿宁睡大觉
对于点ji的方案数)(因为每一个点的dp值都是代表其第一次被走到的方案数,不会包括其它黑点,所以这样是不会多减的),j->i的方案数用上述做法即得。显然的,把点按横坐标排序,我们设dp[i]表示走到第i个黑点且中间没有经过其它黑点的方案数,那么这样就能支撑n^2的遍历了。给定h ∗ w的矩阵,上面有n个黑点,其余的都是白点。这样就能做完这题了。原创 2023-02-04 18:26:29 · 135 阅读 · 0 评论 -
AtCoder Beginner Contest 285 题解
一周有n天,给出一个数组a,现在设计这一周的休息日的安排(至少一个),并计算每周的价值。每天的价值:休息日没价值,工作日i的价值为a[min(i1,i2)],i1表示i至少往前几天有休息日,i2表示i至少往后几天有休息日,n原创 2023-01-25 11:52:36 · 1162 阅读 · 0 评论 -
Codeforces Global Round 14 E Phoenix and Computers
看完上面之后,我其实是存疑的。为什么第一种情况可以认定每一个连通块都有左右两个位置可以放?为什么该情况下插入一格不会导致两个连通块的合并?因为如果两个连通块之间间隔为2的话,放入一个会导致合并,但第一种情况并没有与第三种情况进行去重。以及第二种情况,为什么随便找一个空插进去不会导致连通块合并而一定导致产生新的连通块?这里给出我自己的解释:我之所以会产生这样的疑问,是因为我默认这n台电脑的位置是固定的,它们就摆在那里了,第一台就是第一台,它左边一定没有别的电脑了。这很合理。但是该方法其实是假设有无数台电脑原创 2023-01-04 10:46:01 · 331 阅读 · 0 评论 -
Educational Codeforces Round 140
那么如何求花费最小的点覆盖?如果直接状压枚举情况,复杂度是O((2^m)*m*m),炸了,但是我们发现如果m等于20的话其实复杂度是能吃下的,所以考虑分治。将m种颜色分成两部分,大小为m/2,m-m/2,记作集合A,集合B。显然,在这种情况下,我们可以把所有边分成三种类型:端点都在A里面,端点都在B里面,还有两个端点分别在A和B里面。对于前两种情况,其实是一样的:假设A集合里面我选了一个子集,如果剩下没选的点之间有边相连的话,那么这些边我就没有办法覆盖了,这是一个非法情况。考虑最后一种情况:我在原创 2022-12-18 23:59:01 · 460 阅读 · 0 评论