做题笔记(二)
来自七月和八月的做题。
CF1566F - Points Movement *2600
自己只会 的 DP,当时以为 DP 没有前途,转而去想其他做法,但是实际上正解就是 DP。
首先要把题目简化,不要让没用的东西影响思考,这一步虽然是简单的,但是确确实实能优化算法。
对于已经被点覆盖到的线段和包含其他线段的线段,可以去掉。
CF1498D - Bananas in a Microwave *2200
这题提供了 另一种求解可行性多重背包 的方法,将物品个数的看作是对转移次数的限制。
设 表示之前凑出 最早在哪里,然后 表示 这一轮 凑出 所需的最小步数,一开始 。
对于加法我们有 ,对于乘法可以 ,一个转移合法,当且仅当 ,那么更新 数组即可。
相似题:POJ 1742 Coins。
这东西可扩展性非常广,对于不能保证 和 大小关系的,可以利用桶优化 Dijkstra 一样做到 。
upd on 8.11:假了,可能会出现先超出值域再变回来的情况。
CF1863G - Swaps *2800
想到了 连边,每个连通块独立,这个的交换两点等于交换出边。
然后不清楚贡献怎么算,实际上遇到这样的问题首先考虑树的做法,再考虑加上一个环的解法。
发现了 的结构,对于 操作是没用的。
模拟一下发现了操作一下 ,就会让 变成一个自环。
但是自己没有结合起来考虑,也就是每个点的入边最多选一条。
那么对于树的答案就是 ,加一是因为可以不选,这样进一步发现所有的树上的点都独立了。
考虑环上:
首先去思考对树的解法放到环上有什么影响,答案是算重了。
一个环有 个点 条边,但是发现我们选择 条边就已经将所有的点变成自环了。
那么对于这种情况,实际上就是有 ,对于 这条边钦定不选,那么其他 都选上了,这个点还可以在剩下 条边中选或不选,有 种方案。
那么环的答案就是 。
对于不同的部分显然是独立的,那么直接乘起来。
CF1327F - AND Segments *2500
首先每一位是独立的,限制形如区间均为 和区间存在 。
然后卡住了,没有什么解题方向,实际上这时候应该先去考虑暴力的 DP。
设 表示填了前 个位置,最后一个 的位置为 的方案,预处理出一个 表示 之前(不含 )的 能放到的最前的位置。
对于一个限制 ,我们令 。
然后考虑 暴力的转移:
若 ,,这个,直接维护前缀为 的位置即可。
若 ,,这个相当于不用转移。
若 ,如果限制了 ,那么答案为 ,否则答案为 ,此时相当于是整个数组的和,维护这个即可。
于是转移均摊 ,总复杂度 。
以这题为基准,还有许多应用:P6773,P4229,ABC262Ex。
CF1218G - Alpha planetary system *3000
首先我想到了第一步:将三组数分为 的形式。
当时我认为这个很难直接构造,先思考了二分图的情况,实际上这也是重要的,但是突破口有问题,直接在 DFS 树上构造就至多会有一个不合法!
启发:图的问题先思考树的情况。
对于这一个不合法的,自然是想办法调整。
发现图中有奇环的情况,我们可以 来使得这个点的权值加 ,其他点不变。
否则,说明图是一个二分图。
转而思考将图分成 的情况,不妨令根 的目标为 。
若 ,那么直接合法,因为下一层的点的 。
若根的度数为 ,那么也无妨,因为题目保证了 ,所以下面的点的权值一定大于 的权值。
否则考虑 这两条边,令其都加一,最后得到 。
因为 不相邻(否则存在奇环),并且其他位置没有 的情况,所以这是合法的。
CF1312F - Attack on Red Kingdom *2500
博弈论好题。
对博弈论方面不够敏感,花了 30mins 才往每个游戏组合起来和 SG 函数上去考虑,然后问题就在于 过大,无法暴力求解 SG 函数。
这题的关键在于寻找 SG 函数的循环节。
将连续 个 SG 函数(共 个数字作为一个组合),暴力查找循环节,理论上的最劣情况是 ,但是实际上这个值不会超过 36。
那么我们可以快速算 SG 函数,问题也就迎刃而解。
CF1399F - Yet Another Segments Subset *2300
很难受的一个题,完全不知道自己为啥没做出来 /ll。
直接区间 DP 就是 的,但是自己还要写 的,再去优化一个蠢蠢的 DP。
CF1494D - Dogeforces *2300
我自下而上考虑建树,但是遇到很多问题,没有发现根是确定的,那么从上往下就会特别简单了。
CF1267G - Game Relics *3000
期望好题。
自己首先推出了一个东西:当已经有 个 relic 的时候再得到一个新的 relic 的期望代价是多少,这个直接数列求和即可。
然后观察数据范围想到了背包,但是不清楚怎么背包,这个时候不应该急于寻求做法,应该做一些观察。
Observation 1:最优操作形如先随机若干次,再购买剩下的。
这种贪心被称为 Exchange Argument,因为题目保证了 ,这个策略就显然正确了(这也是自己没关注到的数据范围)。
Observation 2:需要将随机和购买两个操作统一,这个思想也是经常出现的,随机我是无法改变的,所以只能改变购买操作。
问题在于自己没有想到一个关键的转化,也就导致还没有确定题中的“最优策略”,当前剩余的 relic 的价值之和为 ,个数为 的时候,通过购买得到一个物品的期望代价是 ,也可以理解为把代价均摊。
那么已知了 ,最优操作是固定的。
这时要注意期望具有线性性,那么我们不用计算所有方案,只需要计算选择了 个物品后再选一个的期望即可。
枚举 ,最优代价已知,我们知道期望等于概率乘权值,概率就是 个数字里面选 个,选到的和为 的方案,背包加组合数即可计算。
P10855【MX-X2-T4】「Cfz Round 4」Gcd with Xor
遇到 的问题,实际上可以考虑莫反和容斥两个角度。
这个题莫反可以做,但是推导繁琐,实际上采用容斥会更加简单。
化一下式子,把 提出来,枚举 和 ,这样有个 的判断,不牛,直接变成 ,也就是所有的 的倍数,剩下的一个式子是个经典 Trie 问题,直接做。
最后得到真正的答案,就再枚举一下倍数,容斥即可。
主要是一个 Trick:
对于查询区间的子区间的问题,可以转化为离线下来做对子区间的操作,同时记录历史和,在右端点得到答案。
另一个小 Trick,这个东西需要区间加,不是区间赋值,那么需要利用单调栈转化一下。
相似题:P3246 [HNOI2016] 序列
P4617 [COCI2017-2018#5] Planinarenje
二分图博弈的模型。
如果如果一个点一定在最大匹配上,那么以这个点为起点就是必胜的。
考虑对手走一步,我一定能走到另一个匹配点上。
做法是求出最大匹配后,对于不在最大匹配上的点,去 dfs 一次,每次尝试换一个匹配边,然后递归下去。
作者:紊莫
出处:https://www.cnblogs.com/wenmoor/p/18353762/note2
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下