
AtCoder、CF 题解
文章平均质量分 82
主要发ABC的前五题+div2的前五题+div3的前三题
louisdlee.
大二,ICPC区域赛铜,备战银牌ing~
目前准备更新完深入浅出进阶篇。
Q 1677816720,博客有问题的地方欢迎私信。
展开
-
Codeforces Round 997 (Div. 2) A~D题解
每次只排列入度为 0 点,意味着当前放置的点已经不受限制,直接放即可,放完之后把下标往后加,并把周围的入度减一。重叠部分是由上一个矩形的右上角和下一个矩形的左下角重叠而成,所以重叠矩阵的四条边都不会被计算。的子数组大小为奇数时一定是好数组,因为不知道奇数数组具体有多少个,也不知道偶数数组具体有多少个,最好的方法就是用所有的方案数减去。PS:这其实是区间计数问题的模版,因为区间计数问题几乎都是要找到一个能转换为方程式的性质,然后进行前缀和计数这种。所谓可控,就是要量足够小,规律性足够强,能够重复构造的东西。原创 2025-02-04 17:15:46 · 593 阅读 · 0 评论 -
### 2024 江西省赛题解(A,C,D,G,H,J,K,L) BEFI待补
次,其他时候都是承接上一秒的状态,对于上一秒的状态直接记录即可。门开和门关时重新计算一下每个点到哪个门是最近的。所以可以对于每种质因子,为每种质因子创建一个出现次数列表,将出现次数最多的依次从后往前分配。当任意操作都会取等号的时候。中每种质因子的最多出现次数留下来组成的值。也就是当数组中任意两个数都成倍数关系的时候。的每种质因子最小出现次数留下后组成的值,那么存在所有人说的都是真话的可能。个人说的是真话,最后一个人是假话。的倍数,它的最后一位必须是。中的每一位对最终答案的贡献。使得最后的数最大,次大,原创 2025-01-31 16:01:03 · 636 阅读 · 0 评论 -
Codeforces Round 987 (Div. 2)题解 A~D
看似上面一直说合并集合,实际上我们可以发现,当前最高的树只能往右边跳,我们只要维护上一个集合的左端点,以及维护上一个集合的最小值即可。因为最终要求的数是非递减的,所以最终数组内都是同一种数的方案是可行的。回到这个问题,也就是说,最多我们用三份相同的调料包,不可能用四份及以上的调料包。,需要判断是否这棵树能跳到最高的树后面,如果可以的话,那么从。,它可以直接跳到它后面所有的树上,所以直接遍历即可。是偶数的时候,显然可以相邻地放两个相同的数。是奇数的时候,最小的一组勾股数是。由于给定的数是非递增的,所以。原创 2025-01-30 16:51:09 · 744 阅读 · 0 评论 -
Codeforces Round 990 (Div. 2) 题解 A ~ D
所以我们累积每天的拼图总数,如果当前拼图总数达到了当前记录的层数所需的拼图数量,就把层数增加且答案增加。对于一个列它要么是只被经历过第一行,要么只被经历过第二行,要么它是转折处(第一行第二行都被记录答案)。最后判断栈顶的数和堆顶的数谁更大,如果栈顶的数大于堆顶,那么不断将其弹出加一塞到堆内。里面的数有哪些,我们只需要在所有数还没操作的时候,从小到大操作一遍它们即可。我们可以枚举哪些列当转折处,对于剩下的还没被分配的列,不难发现,如果第。里面的元素都是已经被操作过相同次数的数,那么集合。原创 2025-01-28 19:26:02 · 1036 阅读 · 0 评论 -
Codeforces Round 994 (Div. 2) A~D 题解
原创 2024-12-22 16:04:35 · 142 阅读 · 0 评论 -
0基础刷图论最短路 3(从ATcoder 0分到1800分)
AT最短路刷题3(本文难度rated 1200~ 1400)题目来源:Atcoder题目收集:(里面按tag分类好了Atcoder的所有题目,类似cf)(访问需要魔法)这算是一个题单,各位有兴趣可以按照这个顺序来刷。我的代码仅供参考。会提示关键性质和步骤。部分有注释。洛谷、知乎、可以搜到题解。原创 2024-04-11 16:35:41 · 846 阅读 · 0 评论 -
0基础刷图论最短路 2(从ATcoder 0分到1800分)
ATC最短路2 (本文难度rated 1000~ 1200)题目来源:Atcoder题目收集:(里面按tag分类好了Atcoder的所有题目,类似cf)(访问需要魔法)原创 2024-04-11 16:30:45 · 539 阅读 · 0 评论 -
0基础刷图论最短路 1(从ATcoder 0分到1800分)
ATC最短路1 (本文难度rated 0~ 1000)题目来源:Atcoder题目收集:https://atcoder-tags.herokuapp.com/tags/Graph/Shortest-Path(里面按tag分类好了Atcoder的所有题目,类似cf)(访问需要魔法)文章目录ATC最短路1 (本文难度rated 0~ 1000)1-**Hands**2- **Cat Snuke and a Voyage**3-**Collision** https://atcoder.jp/cont原创 2024-04-11 16:27:00 · 1212 阅读 · 0 评论 -
Educational Codeforces Round 156 (Rated for Div. 2)
对于我们要获得第几次的字符串,就需要从位置n入手,因为第0次的字符串,删除了0个字符,长度为s.size()可以提前算出来 0----a、0-----b、a-----b、a----p、b-----p 之间的距离。假如我们要获得第 k次的字符串,那么我们重复k次,每次将第一个遇到的逆序字符删除就行了。第k次的字符串,删除了k个字符,长度为s.size()-k。因为2%3的余数是2,4%3的余数是1。对于一个数,它模以3只有三种结果:0,1,2。那么a,b模以3也只有三种结果,0,1,2。原创 2024-03-02 13:16:14 · 888 阅读 · 0 评论 -
Codeforces Round 905 (Div. 3)
对于k==4, 因为任何数不是偶数就是奇数,所以计算奇数偶数个数即可。题目比较仁慈,只要我们的集合里面有不相交的线段,就输出yes。所以我们先统计出现奇数次的字符有多少次,设为cnt。所以若k>cnt,那么多出来的用偶数次的抵消即可。=4,只需要取模k找余数离k最近的即可。若k<cnt,若cnt-k>1,则无法构成回文。当偶数只有一个,且奇数大于1个,则答案为1。所以只有全都是相交的线段时,才输出NO。所以分为k==4 和k!当偶数超过2个,或者存在4,答案为0.当没有有数,如果有3,那么答案为1。原创 2024-02-28 11:58:20 · 977 阅读 · 0 评论 -
AtCoder Beginner Contest 340
选择用vector,如果是操作1,就pushback。用dikjstra算法即可,一个很板的题。很简单的记忆化搜索,按照题意模拟即可。如果是操作2,直接从后往前找第k个。单点查询,区间修改,懒惰标记。原创 2024-02-28 11:42:39 · 443 阅读 · 0 评论 -
AtCoder Beginner Contest 339
(a[j]\in[\ a_i-d,a_i+d\ ])$结尾的最长合法序列的长度。显然,要优化,不可能优化第一层循环,因为这是必需的时间复杂度O(n)的。我们就以a[i] 作线段树的下标,然后 dp[i] 作对于的值。所以我们只要再来一层循环,枚举 $j \in [1,i-1]而以 a[i]结尾的最长合法序列的前一项------a[j]通俗一点就是,在已经出现过的序列内的一个区间中找区间最大值。由于是bfs,所以每次步数都是上一次+1,很好转移。暴力做法就是,求以a[i]为结尾的最长合法序列。原创 2024-02-28 11:41:57 · 1712 阅读 · 0 评论 -
AtCoder Beginner Contest 335
我们最开始的状态倒过来存入数组中,然后每次修改一次,就往数组后面添加一个状态。查询的话就输出 v[ v.size() - p ] 即可。朴素做法是,每一次修改前,修改a[i]=a[i-1]蛇形矩阵,记录一个是否前方为边界,或前方是否被占用。时间复杂度为O(nq) =把最后一个字母改成字符串。三重for循环嵌套即可。原创 2024-02-28 11:40:53 · 440 阅读 · 0 评论 -
Hello 2024
如果负号少,正号多,那么一定能有一个或多个区间将正负号抵消,那么剩下来的正号单独划分即可。可以得出,如果元素之和的绝对值>=1 的时候,若长度大于1,其罚金必然比 单独元素交的罚金多。此时需要放在y后面,因为如果放在x后面,x本来很长的板子就缩短了,不利于后续的操作。所有情况就讲完了,但是有一个错误点,就是,不一定a[2]作为一个区间的开头更优秀。将a[2]放在t2后面更优,因为t2的原本短的结尾更长了,能挡住更多的元素。wa了很多次,先讲讲错了的思路,然后可以更好的过度到正确的思路。原创 2024-02-28 11:39:03 · 949 阅读 · 0 评论 -
Codeforces Round 922 (Div. 2)
只要我们把一个数组排好序,那么不管怎么交换,都不会减少逆序对的数量。如果发现一行填不满,只需要将一个位置换成 1x3的砖块即可。1、选中的下标里有一对逆序对,那么交换后,仍然是一对。找到a中第一个与b不同的位,且a在这位上是1.2、选中的下标里有两对逆序对,交换后变成0对。3、选择的下标里有0对逆序对,交换后变成2对。第x位为1大于 0~x-1 的所有位为1的值。此后,所有的a与b不同的位,x都与a相同即可。不需要竖着的砖块,全部为横着的砖块即可。其余的都填1x2的砖块。二进制,位运算,贪心。原创 2024-02-28 11:38:22 · 370 阅读 · 0 评论 -
Codeforces Round 921 (Div. 2)
所以,我们可以从1~m扫一遍,记录有多少份合格的单元(包含前k种字符)构造一个 n*k 长度的字符串,将字符串分成n份,每一份长度为k。开始打擂台, ans=max(ans,符合条件的因数)如果合格的单元少于n,那么这个字符串一定是不合格的。(合格的单元的最后一个字符+不合格单元缺少的字符)那么将x分为n份方案,每份方案必然是x或x的倍数。由第一题可知,给定的m必须是大于或等于n*k。(这个规律很难找,需要自己多写一些长的样例)如果 (x/i)*n < x 也记录答案。枚举x的因数i,x/i。原创 2024-02-28 11:37:36 · 354 阅读 · 0 评论 -
Codeforces Round 919 (Div. 2)
/当g==0时,说明,v[j+1]=v[j],也就是每一项都相同。如果爱丽丝要消除j个元素(必然从最大的开始消除),那么消除掉的元素之和:nxt[n-j]显然,要找到一个m,使之满足上面的所有式子,那么m必然是它们的最大公约数。注意到,如果不满x个,那么我们就选剩下的所有: sum-nxt[n-j]只要枚举j 使2nxt[n-j-x]-nxt[n-j] 最小即可。我们需要找到m,使得每一段的数,分别对m取模的结果是一 一对应的。也就是减去 2倍的 nxt[n-j-x]-nxt[n-j]原创 2024-02-28 11:36:58 · 872 阅读 · 0 评论 -
Codeforces Round 906 (Div. 2)
所以,这个数组的长度必须是偶数,不能是奇数,因为奇数会多出一个自己和自己配对的情况。给一个数列a,元素只包含01,我们可以选择插入数组b 使得数列a的元素交替进行。若数列a内有两个元素,如果这两个元素能满足交替进行的数量那么也是YES。给你一个数列,任意排序,使得相邻两项的和为k,判断是否存在这样的构造。2、当连续的数是00,且数组b交替进行,且数组b的两端是1,则yes。1、当连续的数是11,且数组b交替进行,且数组b两端是0 则yes。显然,当数列a中有两个连续的数的时候,我们才需要插入01。原创 2024-02-28 11:36:13 · 969 阅读 · 0 评论 -
Codeforces Round 161 (Div. 2)
如果 x<y , 那么我们需要不断的往右移动,如果x+1 是x的最近城市,那么移动到x+1只需要1个金币, 否则移动到x+1就需要 a[i+1]-a[i] 个金币。 2.C[i]与它们相同时,则不可能存在t[i]与AB匹配的同时与C不匹配 , ans++ 1.C[i]与它们不同时,那么可以找到一个t[i]与AB匹配与C不匹配,bns++ 2.C[i]与它们相同时,则不可能存在t[i]与AB匹配的同时与C不匹配, ans++作为等边三角形的边的种数。原创 2024-02-28 11:35:42 · 843 阅读 · 0 评论 -
Codeforces Round 929 (Div. 3)
他的部分值为:sum2= (u+1) + (sum[pos]-sum[l-1]-u-1) 分为两个部分,一部分是能力增长的,一部分是能力下降的。能力值:(u-sum1+1 + u)*(sum1)/2 (等差数列,首项为u,末项为u-sum1+1,项数为sum1)(负值) (1+ sum[pos]-sum[l-1]-u-1)*(sum[pos]-sum[l-1]-u-1)/2。当sum=1,最少的操作是1,前提是取模后的a数组内有1存在,对a排序后用find查找即可。原创 2024-02-28 11:34:10 · 904 阅读 · 0 评论 -
Codeforces Round 925 (Div. 3)
我最开始的想法是模拟,将所有数据插入multiset中,然后当sasha操作的时候,取出里面最大的和最小的,合并,然后放回multiset中。一共就三个字母,我们只要每次从第一个字母开始,如果搜满三个字母,且正好总和为n,那么这就是答案,直接返回即可。算出平均数,然后从1开始,将多了的传递给下一个,直到最后一个,再检查一下第一个和最后一个是否为平均数即可。先手Anna,她最优的操作是反转后置0最多的数,使得总位数减少的多。所以记录位数之和,然后记录每个数的后置0,并按后置0个数从大到小排序。原创 2024-02-28 11:33:31 · 1617 阅读 · 0 评论 -
Codeforces Round 923 (Div. 3)
将a,b数组内所有的小于等于k的数字都插入到集合a1、b1、 t中。(t是插入a,b元素的总和)=a[i-1] , s[i]=i-1;否则 s[i]=s[i-1];如果,第i个数与第i-1个数不一样,记录这个不一样的地方的开端:i-1。如果区间[l,r] 之间所有数都一样,那么 s[l]=s[r]s[i] 等于 i的左边第一个与a[i]不一样的点的下标。s+=c 和 s=s+c 的时间复杂度是不同的。三:计算集合a,b之间不重复元素的个数,记为cha。如果i+1还是不一样的话,那么记录不一样的开端:i。原创 2024-02-28 11:32:56 · 435 阅读 · 0 评论 -
Codeforces Round 913 (Div. 3)
所以我们要想三位数不进位,那么就将每一位数分成3份,放到 相应的位上。当出现b/B,就将计数器++,当出现大小写,就将计数器–,并标记。当a+b+c 会进位的时候, 9+1–>10 ,位数之和就减少了9。当k超级小的时候, 如k=1 ,l[i]=2,r[i]=4。所以当 start>end 的时候,这个区间是不存在的。我们注意到,每一次跳,start的结果必然>=l[i]很好理解,因为a,b,c都是十进制,当你缝9进1。例如99,将个位的9,分成3份到abc的个位上。原创 2024-02-28 11:30:40 · 1008 阅读 · 0 评论