CF 杂题选做
CF2018D Max Plus Min Plus Size (Difficulty: 2200)#
因为最小值错了会使答案更小,最大值错了会使答案更大,所以可以钦定最小值,这样就能保证答案的正确性。
然后考虑 DP。设
这样不一定会选中钦定的最小值,但不选中是一定不会更优,所以也不会影响答案的正确性。
每次枚举最小值后暴力 DP 是
考虑 DDP。对于每个点维护出对应的转移矩阵,每次就只会修改一个位置的矩阵,并查询整体的乘积。可以使用线段树维护。
于是可以优化到
CF1970E3 Trails (Hard) (Difficulty: 2200)#
由于限制只能走
维护出每一天的移动矩阵
这样时间复杂度是
然后考虑将矩阵
但还是无法通过。注意到答案只要求第一行,所以最后一次矩阵不必完整操作。转移就可以将时间复杂度优化到
CF1970G3 Min-Fund Prison (Hard) (Difficulty: 2400)#
由于边双无法被隔开,所以可以先将边双缩点,变成森林。
注意到添加的边数一定为连通块数减一,然后就只需考虑如何划分点。于是问题就转化为:有一个森林,你可以选择一棵树断掉一条边,变成两棵树。现在要把树划分为两个集合
考虑 DP。设
注意到这可以用 bitset
优化,于是可以做到
CF1868C Travel Plan (Difficulty: 2400)#
由于
然后考虑 DP,记枚举的最大值为
然后可以用 map
记忆化。或者因为左右子树至少有一边是
时间复杂度为 map
就还要带上
CF730J Bottles (Difficulty: 1900)#
别问为什么会做到 1900 的题,问就是 duel 的。
先贪心地把所有瓶子按
第一问的答案是好求的,直接扫一遍即可。于是只需考虑第二问。
考虑 DP。设
时间复杂度
CF1845E Boxes and Balls (Difficulty: 2500)#
首先,因为可以来回移动某个球,所以操作步数可以为
考虑设
其中
直接做是
考虑经典方法:对每个间隙计算贡献。于是记
于是可以设
由于
CF1187E Tree Painting (Difficulty: 2100)#
还是 duel 的。
考虑以最初操作的节点为根。
那么第一次操作完就会分成一些子树,并且每个子树的贡献是独立的,可以分开计算。于是可以通过 DP 求出。
然后考虑换根,发现这也是简单的,可以直接维护。
CF1619G Unusual Minesweeper (Dufficulty: 2000)#
duel 上瘾了。
考虑将爆炸会互相影响的点连边后一起考虑,可以使用并查集实现。而每个连通块自己爆炸的时间就为连通块内点权最小的点。
然后贪心地考虑,每次一定是点燃爆炸时间最晚的连通块。于是可以按爆炸时间排序,然后扫一遍即可。
CF748F Santa Clauses and a Soccer Championship (Difficulty: 2300)#
Conclusion: 只选树的带权中心一定满足条件。
Proof:
考虑构造性证明。因为树的带权中心的任意子树的权值和均
CF1784D Wooden Spoon (Difficulty: 2400)#
先钦定获得安慰奖的选手一定为
考虑用
接下来考虑已知数组
既然已知如何计算方案数,那么 DP 是显然的。设
可以用前缀和优化到
最后
CF1729G Cut Substrings (Difficulty: 2100)#
先用 KMP 预处理出
然后考虑 DP。设
然后直接转移即可。
时间复杂度
CF1622E Math Test (Difficulty: 2200)#
根据经典结论,
于是就可以确定每个人的
直接不好做,于是考虑每道题的贡献。先计算出每道题会被计算多少次,记为
根据排序不等式,可以将
时间复杂度为
CF144E Competition (Difficulty: 2200)#
感觉挺水的,不知道怎么评到 2200 的。
从左往右以此考虑每一个点。那么每个点的目标点都构成了一段区间,每次贪心选择区间内最靠右的未被选择的点即可。可以用 set
维护。
CF2000G Call During the Journey (Difficulty: 2100)#
为什么我认为这题严格大于上一题?难道是因为我 duel 输了?
考虑倒推。设
-
若
,即可以乘公交,那么有 。 -
否则有两种情况。要么步行,要么等到
再乘公交。那么有 。
发现这是类最短路问题,可以使用 Dijkstra 优化。
CF1553E Permutation Shift (Difficulty: 2100)#
先考虑枚举右移的位数
这是经典问题。直接从初状态的第
这样直接做是
注意到
时间复杂度
CF1582F Korney Korneevich and XOR (Difficulty: 2400)#
最简单的想法是设
考虑设
考虑优化。发现
再观察到对于一个 vector
维护出每个 vector
清空。
最后分析时间复杂度。转移是的 vector
的大小最多为
于是最后时间复杂度为
CF1542D Priority Queue (Difficulty: 2200)#
考虑枚举
考虑 DP,设
-
若
为-
,那么可以从 转移过来。特别强调:当
时,就算选择当前位置也可能不会导致 的改变,所以还可以从 转移过来。 -
若
为+
且 ,那么可以从 zu 转移过来。 -
若
为+
且 ,那么可以从 转移过来,因为选不选 都不变。
而当
时间复杂度
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?