Codeforces Round 982 (Div. 2)解题报告
A
显然答案不会小于 。
构造方案学习样例一,挺明显的。
B
有个小性质(好像没用):一旦能通过操作变成 non-increasing,再对整个序列操作一次必然变为同一个数字。
我们把一开始 remove 的数字记为A类,通过操作删掉的记为B类,保留的记为C类。
枚举第一个C类的下标,那么它前面的都一定是A类(因为操作不可能删空一个序列),后面的比它大的也一定是A类,其余的是B类最优。预处理每个位置后面比它大的数字个数 ,答案就是 。
C
加进来的零肯定动不了,问题变为每次选一个 使得 ,得分和 都增加 ,求最大得分。
由于 单调不减,能供操作的 一定是按照 升序,而且 增加类似转移,这提示我们往 DAG 想。每个点权值为 ,连边到所有权值为 的点。用虚拟点辅助连边,bfs即可。
D
简单的想法是DP,考虑 表示 已被消除, 序列到了 的最小代价。则:
其中 是 的前缀和。
这样配合使用线段树转移, 为第一层循环,每层 枚举的 一定是一段区间,找一个区间最小值。时间复杂度 可以解决D1。
考虑D2求方案数,维护多一个 以及线段树中维护最小 对应的 之和即可转移,时间复杂度不变。
前四题均不超过蓝题水平,目测cf1900-。
E1
游戏规则就是取石子,但是只能够取当前个数二进制下某子集个,且最多取 个。关键算出 SG 值。
先考虑没有 限制的情况,打表发现 恒成立。数学归纳法证明如下:
若 ,则:
枚举 的后继 , 的 SG 即为 某个子集的 popcount,且理所当然能够取遍 ;至少取走一个,所以取不到 以上。得证。
考虑有 限制时,发现 SG 只可能变小。
而且若 最高位为第 位,比 大的位永远取不走,相当于不存在,直接不要了就行。随后看留下的数字 (此时 与 位数相同),如果 小于等于 , 怎么操作都不受 影响,答案就是 。
于是只需要处理与 位数相同且 的 的 SG 值即可。
之后打表猜了几个规律例如: 以及依次迭代得到的所有 SG 值变成0,其它不变;偶数就先加一再开始。但都不是太对。
看题解:发现如果 和 某一位都是 0 那么就可以把这位删掉, 是 1 且 是 0 等价于 把这一位变成 0,后面全部变成 1。这样我们就能把 变成 的形式,只考虑 这一个变量决定 SG 即可。打表容易发现规律(题解有)。
利用此规律求出每堆石子的 SG,E1可通过,时间复杂度
分析为什么我没有做出此题,一方面是对博弈论过于依赖打表,对题目性质分析不够;另一方面是对这里二进制的感觉有些偏颇,看到 这种限制就往lowbit这种二进制方向猜结论,就被迷惑了。实际上题解思路更加看重对大小比较的限制,才有了同时删去 0 以及"等价于 把这一位变成 0,后面全部变成 1"这样的关键分析。启发我们要对限制深入研究,总结自己推出来的小结论本质上究竟指向什么。
E2
由于 SG 值有限,数位DP 即可求出每种 SG 的方案数,再异或卷积即可。
DP 大概就是记录当前 到第几位, 删了几个 0,是否剩下全为1之类的,用于判断最后的SG。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现