CF简单题
开坑,大概会写到能稳定切出 \(70\%\) 以上的此分段题目或退役为止。
老子退役了,不更了
注意:没有详细题解
CF1537E2 2021.9.2/9.3
偷瞄了一眼题解。
自己想的时候想到了一个性质:字典序优势出现在越前越好,然后想出了一个大概类似双指针的奇怪维护方法,发现好像可以做。然后想重复怎么办,10分钟发现 \(S\) 和 \(S+S\) 的拼接结果是一样的。接着发现脑子乱成奥利给了。
今天看了看,瞄到题解一句话:设最优的前缀到 \(p\)。接着我就发现发现字串 \(i\) 和子串 \(p\) 的大小随便递推一下就可以比较了。 wmnz。
解法:循环 \(i\) 跑源字符串,考虑 \(p\) 匹配到 \(i\) 的情况 如果有字典序劣势,直接取用 \(p\) 并跳出循环即可,如果字典序没区别,需要继续,但啥也不用做,如果表示有字典序优势,可以用 \(i\) 更新 \(p\)。判定只要判断 \(i\) 和 \(i \bmod p\) 即可。最后其实连数组都不用开。
CF1527D 2021.9.3
没有看题解自己做出,耗时约 1.5h。
我们不太好处理 mex,于是差分一下,变为询问有多少条链能够覆盖掉 \(1-n\) 的所有点。这个就非常好做了,开两个变量表示这个链的最长端点,新加一个点的时候先判一下他是不是在链上,这一步可以树刨维护。然后再判一下它是否可以延长这个链,这就要分路径有无折角讨论,分类和代码难度比较烦,但思维绝对是不难的。
CF1555E 2021.9.4
看了题解才会,之前没有一点想法。
先把题目中的区间转化为左闭右开,这样完全覆盖就更好判定许多。接下来我们用一个线段树维护每个点的覆盖次数,只要都非0就说明可以连通。好妙啊。也不是很难我就是想不到。接下来双指针就行了。
CF1553F 2021.9.4
想了一下。发现很好做。推式子得到只要求算两个东西:\(\sum_{i=1}^k a[i] \times \lfloor \frac{a[k]}{a[i]} \rfloor\) \(\sum_{i=1}^k \lfloor \frac{a[i]}{a[k]} \rfloor\)因为 \(a_i\) 互不相同所以可以均摊调和级数。
显然第二个式子可以随便搞,第一个就必须用点技巧了。死活没想出来怎么在计算 \(a[i]\) 时算贡献,后来看了题解发现可以维护一个以值为下标的区间修改单点查询树状数组,查询的时候查询 \(a[k]\),修改差不多。wmnz。
CF1485D 2021.9.10
大水题,对棋盘进行类似国际象棋的染色,白格上放所有数的 lcm ,黑格上放 $lcm+a[i][j] ^{4} $,就做完了。这让我想到了以前的 AGC027D ,这些方格,4相邻的构造题很多时候都可以黑白染色做。
CF1553E 2021.9.10
要不是我想到了个错解,这题还搞不出来。
显然移动和交换的顺序没有影响。原序列向右移动就是末序列向左移动。于是我们可以枚举末序列向左移动的位置,然后计算交换次数。
我一开始想着交换次数就是不在自己位置上的数个数,这样的话可以随便开桶维护移动后在自己位置上的数的数量。(因为一个数要移几位才能在第 \(i\) 位本质只与 \(\lvert i-a_i \rvert\) 相关)后来想想不对。发现本质上是每个数和他该在的位置号连边,形成的连通块数量。
接着发现一个诡秘条件: \(m \le \frac{1}{3}n\) ,一阵推导后发现这个条件告诉我们至少要有 \(\frac{1}{3}n\) 个数在该在的位置上。这就做完了,因为最多只有3个移位长度,使得有超过 \(\frac{1}{3}\)个数在它该在的位置上。
时间复杂度显然是 \(O(n)\)。
CF1485F 2021.10.3
我他妈的,为什么这种煞笔题都要想上一个小时?
有一个很显然的 dp ,设 \(dp_{i.j}\) 表示到第i个数,上一次使 \(b_i=\sum_{j=1}^ia_i\) 的位置是在j。
接着转移方程看上去很可以线段树优化,但容斥去重不太好办。注意到仅当 \(\sum_{k=j}^{i-1}b_i\)时会被重复计算,于是我们修改状态为 \(dp_{i,x}\)表示 \(x=\sum_{i=1}^{j-1}b_i\)。
接着随便用动态开点线段树或用个map随便维护一下就好了。
CF1594E2 2021.10.8 (2300)
低思维难度码题 + SpeedForces,差评。
E1 傻逼题,不表。有了E1的铺垫,我们可以自然地想到开一个数组 \(f_i\) 表示深度为 \(i\) 的树如果只钦定根节点的颜色,其它没有任何限制的方案数。
注意到一个有限制的点只能对他的所有父节点产生影响,所以其实最多只有\(n \times k\) 个节点是与 \(f\) 不同的,而 \(n \le 2000\) 且 \(k \le 60\)。就可以暴力 DP 。
设 \(dp_{i,j}\) \((j\le 6)\) 表示 \(i\) 号点的子树,钦定 \(i\) 号点的颜色为 \(j\) 的方案数。
这道题的思维量很小,难点都在实现上, \(dp\) 数组需要动态开点,否则炸空间。你还可以开一个 map 表示 \(p\) 点的子树里是否有关键点。
考试的时候傻逼,认为堆式线段树的子树内节点编号是连续的,就没调出来,结果掉大分。
CF1592D 2021.10.3 (2300)
这场CF作为Div2偏难,喜欢这样的比赛。
放在D的位置有点诈骗,其实思维难度不大啊……
首先先问一遍所有点,可以得出所有边权的最大值。
很显然,最大值一定是一条边。
看到数据范围想到二分查找,思路大概是每次分出一个一半大小的连通块,查找最长边是否在这个连通块里面。
考试时候傻逼了,一开始想着用 dfn 序,但发现两个 dfn 序相邻的点在原图中不一定相邻,结束前 10 分钟才想到可以欧拉序,但来不及改了,掉大分。
赛后别人告诉我可以用 bfs 序来做,这就比较妙了。
注意如果用欧拉序写要开两倍空间。