Codeforces Round 982 (Div. 2)解题报告

Codeforces Round 982 (Div. 2)解题报告


A

显然答案不会小于 2(maxw+maxh)

构造方案学习样例一,挺明显的。


B

有个小性质(好像没用):一旦能通过操作变成 non-increasing,再对整个序列操作一次必然变为同一个数字。

我们把一开始 remove 的数字记为A类,通过操作删掉的记为B类,保留的记为C类。

枚举第一个C类的下标,那么它前面的都一定是A类(因为操作不可能删空一个序列),后面的比它大的也一定是A类,其余的是B类最优。预处理每个位置后面比它大的数字个数 pi,答案就是 maxi=1ni1+pi


C

加进来的零肯定动不了,问题变为每次选一个 i 使得 ai+i1=|a|,得分和 |a| 都增加 i1,求最大得分。

由于 |a| 单调不减,能供操作的 i 一定是按照 ai+i1 升序,而且 |a| 增加类似转移,这提示我们往 DAG 想。每个点权值为 bi:=ai+i1,连边到所有权值为 bi+i1 的点。用虚拟点辅助连边,bfs即可。O(nlogn)


D

简单的想法是DP,考虑 fi,j 表示 a[1i] 已被消除,b 序列到了 j 的最小代价。则:

fi,jfi,j+1s.t.i<nfi,j+mjfk,js.t.sksibj

其中 sa 的前缀和。

这样配合使用线段树转移, j 为第一层循环,每层 k 枚举的 i 一定是一段区间,找一个区间最小值。时间复杂度 O(nmlogn) 可以解决D1。

考虑D2求方案数,维护多一个 gi,j 以及线段树中维护最小 f 对应的 g 之和即可转移,时间复杂度不变。


前四题均不超过蓝题水平,目测cf1900-。


E1

游戏规则就是取石子,但是只能够取当前个数二进制下某子集个,且最多取 a 个。关键算出 SG 值。

先考虑没有 a 限制的情况,打表发现 SGi=popcount(i) 恒成立。数学归纳法证明如下:

SG0=0,SG1=1

i<n,SGi=popcount(i),则:

枚举 n 的后继 ini 的 SG 即为 n 某个子集的 popcount,且理所当然能够取遍 0,1,,popcount(n)1;至少取走一个,所以取不到 popcount(n) 以上。得证。

考虑有 a 限制时,发现 SG 只可能变小。

而且若 a 最高位为第 k 位,比 k 大的位永远取不走,相当于不存在,直接不要了就行。随后看留下的数字 x(此时 xa 位数相同),如果 x 小于等于 ax 怎么操作都不受 a 影响,答案就是 popcount(x)

于是只需要处理与 a 位数相同且 >ax 的 SG 值即可。

之后打表猜了几个规律例如: a+lowbit(a) 以及依次迭代得到的所有 a SG 值变成0,其它不变;偶数就先加一再开始。但都不是太对。

看题解:发现如果 ax 某一位都是 0 那么就可以把这位删掉,a 是 1 且 x 是 0 等价于 a 把这一位变成 0,后面全部变成 1。这样我们就能把 x 变成 2k1 的形式,只考虑 a 这一个变量决定 SG 即可。打表容易发现规律(题解有)。

利用此规律求出每堆石子的 SG,E1可通过,时间复杂度 O(nlogA)

分析为什么我没有做出此题,一方面是对博弈论过于依赖打表,对题目性质分析不够;另一方面是对这里二进制的感觉有些偏颇,看到 x&d=d 这种限制就往lowbit这种二进制方向猜结论,就被迷惑了。实际上题解思路更加看重对大小比较的限制,才有了同时删去 0 以及"等价于 a 把这一位变成 0,后面全部变成 1"这样的关键分析。启发我们要对限制深入研究,总结自己推出来的小结论本质上究竟指向什么。


E2

由于 SG 值有限,数位DP 即可求出每种 SG 的方案数,再异或卷积即可。

DP 大概就是记录当前 x 到第几位,a 删了几个 0,是否剩下全为1之类的,用于判断最后的SG。O(nlog2A)


posted @   Vizing  阅读(21)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示