CodeForces 随机乱做
2026.02.03
001. CF1066F Yet another 2D Walking(*\(\color{orange}{2100}\))
难度:\(2/10\)
容易发现在走 \(\max\) 值相等的同一层时,一定只有两种不同的做法:
- 从左上角向右走到右上,然后再向下走到右下。
- 从右下角向上走到右上,然后再向左走到左上。
容易证明其余情况一定都不优。
然后问题就简单了:因为只能从 \(\max\) 小的地方走到 \(\max\) 大的地方,所以考虑直接区间 dp:维护出每一个 \(\max\) 值相同的连续段 \(l_i,r_i\),然后设 \(f_{i,0/1}\) 表示当前走了前 \(i\) 个连续段,当前位于左上角 / 右下角,最小所需的花费是多少。转移是容易的。
总时间复杂度为 \(O(n\log n)\),瓶颈在于排序,换个基排可以做到理论 \(O(n)\) 时间复杂度。
002. CF1997E Level Up(*\(\color{orange}{2200}\))
难度:\(3/10\)
\(O(n\log^3n)\) 的做法的调和级数 + 二分 + 内层 ds 做法是简单的,但是因为 \(n\) 很大所以难以通过。
考虑优化。注意到若 \(k\) 确定为一个值的时候,某个怪物不会逃跑,那么 \(k\) 增大的时候这个怪物一定不会逃跑。同理,若 \(k\) 为一个值的时候某个怪物会逃跑,那么 \(k\) 减小的时候这个怪物一定也会逃跑。因此考虑让 \(k\) 从小到大扫描,然后每次增大处理出二分处理出新的不会逃跑的怪物,用树状数组简单维护即可做到 \(O(nlog^2n)\)。
003. CF1144G Two Merged Sequences(*\(\color{red}{2400}\))
难度:\(2.5/10\)
简单 dp。容易想到设 \(f_{i,0/1}\) 表示当前处理了前 \(i\) 个数:
- \(0\):当前元素处于递增序列中,递减序列最后一个元素的最大值。
- \(1\):当前元素处于递减序列中,递增序列最后一个元素的最小值。
转移是容易的,分四类讨论当前元素和上一个元素分别位于递增序列 / 递减序列中即可。总时间复杂度为 \(O(n)\)。
004. CF1693D Decinc Dividing(*\(\color{red}{2800}\))
难度:\(5/10\)
直接按照上述做法暴力判断可以做到 \(O(n^2)\) 求解,但是这显然过不去。
考虑换一个枚举顺序:从大到小枚举左端点 \(l\),然后从 \(l\) 位置开始往右扫 \(r\)。在向左移动左端点 \(l\) 的过程中,若对于某个扫描到的右端点位置 \(r\),其两个 dp 值均和上一次 \(l\) 对应的 dp 值相同,那么容易证明之后所有 dp 值都是相同的(根据 CF1144G 的题解可知 \(f_{i,0/1}\) 的值只依赖于 \(f_{i-1,0/1}\)),后面的 dp 值无需继续更新。
然后你写上这个优化之后惊奇的发现你通过了这道题,下面考虑严格的证明一下该算法正确性。
首先可以证明 \(f_{i,0}\) 和 \(f_{i,1}\) 对于同一个数组一定是分别单调的,原因显然。
然后考虑对于一个位置 \(i\),\(f_{i,0/1}\) 的取值。
找到最大的位置 \(j\) 使得其满足 \(a_j>a_{j+1}\),那么 \(f_{i,0}\) 的取值必然只能从 \(a_j,a_{j+1},+\infin,-\infin\) 中取,后两种情况是无解和还没选到这个序列内(可能不存在这样的 \(j\)),而考虑到 \(a_j,a_{j+1}\) 两个元素必然不能被同时选到单调递减的序列里,所以必然有一个作为单调递增序列的结尾元素。
同理,找到最大的位置 \(j\) 使得其满足 \(a_j<a_{j+1}\),\(f_{i,1}\) 的取值也必然只能从 \(a_j,a_{j+1},+\infin,-\infin\) 中取,后两种情况是无解和还没选到这个序列内(可能不存在这样的 \(j\)),而考虑到 \(a_j,a_{j+1}\) 两个元素必然不能被同时选到单调递增的序列里,所以必然有一个作为单调递减序列的结尾元素。
因此一个位置的 dp 值最多有 \(8\) 个不同取值,也就是说最多会被改 \(O(1)\) 次取值,因此期望均摊枚举 \(O(1)\) 个右端点就可以找到和上一次 dp 值相同的位置,总时间复杂度也就被优化到了 \(O(n)\)。
2026.02.04
005. CF1730D Prefixes and Suffixes(*\(\color{orange}{2200}\))
难度:\(4/10\)
考虑下面的几个性质(这也太难了):
- 对于给定的两个串 \(s_1,s_2\),其中任意一个位置 \(i\) 均满足 \(s1_i\) 和 \(s2_{n-i+1}\) 相对位置不会改变。
- 对于任意一个位置 \(i\),字符对 \((s1_i,s2_{n-i+1})\) 可以被整体移动到任何一个位置(但是她们自己不能被拆分)。
然后问题就变得比较简单了。考虑记录每个字符对 \((i,j)\) 在串 \(s_1,s_2\) 中出现的次数。为了让两个串 \(s_1,s_2\) 经过操作后相等,必须满足:
- 对于字符对 \((i,j)\)(\(i\neq j\)),其必须出现偶数次。
- 对于字符对 \((i,i)\),若 \(2\mid n\) 则其必须出现偶数次,否则必须有最多一对出现奇数次,其余对均出现偶数次。
开桶维护字符对,时间复杂度为 \(O(n+\omega^2)\) 其中 \(\omega\) 为字符集大小,在本题中取 \(\omega=26\)。

浙公网安备 33010602011771号