Codeforces Round 994 (Div. 2)
Codeforces Round 994 (Div. 2)
A
首先答案小于等于 。因为对所有数取一次 mex 后,再对得到的数取一次 mex,就得到一个 。
考虑什么时候答案为 ,当且仅当所有数为 。
什么时候答案为 ,数组中前缀是 ,后缀是 ,中间是一段非 。
其他情况都是 。
B
如果存在某个 p
在 s
前面,显然无解。因为 不可能放到一个合理的位置。
那么考虑最左边的 p
(设下标为 )和最右边的 s
(设下标为 ),字符串形式如下:
s.s.s.sss....s.....p.p..p.p...p.pp
^ ^
不难发现对于这两个 s...p
,p
要求 出现在 ,而 s
要求 出现在 ,那么 就要出现在 中间。
有 个数, 有 个位置。
- 若 ,那么要求 ,即 。
- 若 ,那么要求 ,即 。
所以最后的条件就是 ,否则无解。
C
考虑偶数时,显然有构造 。如果 连接了 ,对这个原构造没有影响。如果 连接了 ,可以让其中一个 改为 。如果连接了 ,我们可以将构造循环移位一位,就是连接 了。
奇数时,有构造 。不难发现,我们通过循环移位,一定可以把 变成连接了 或 ,这两种情况都对原构造没影响。所以奇数只需要循环移位就可以得到合法构造了。
事实上,这题有一个更强的构造。我们可以对于任意图都构造出一种合法的填数方案。
具体做法是,按照任意顺序填数,填的时候就填「相邻的、已经填过的」节点的 即可。
首先这个构造对于当前节点是合法的,其次对于其他已经填好的节点是没影响的,经过有穷步我们可以填完所有节点。
此方法是从 StarSilk 听来的。
D
考虑 dp。设 f[i][j][k]
表示「走到格子 ,当前行(第 行)循环左移了 位」的最小花费。
主动转移有点困难,主要是 f[i][j][k] -> f[i+1][j][k']
。这里的 可以有 种取值,3D/1D 时间复杂度不对。
考虑被动转移。f[i][j][k] <- f[i][j - 1][k]
,这个显然。f[i][j][k] <- min(f[i - 1][j][k'])
,这个可以预处理,设
于是转移是 的,时间复杂度 。
E
考虑用异或的性质:。并且我们知道,一次询问的答案是 。
于是考虑这个表达式 。这个表达式为真当且仅当 在区间 。
于是花费两次询问,我们知道 在 还是 。不妨设 在 。
接下来询问 ,这个表达式的值可以告诉我们 是否为真。
- 若 ,那么我们令接下来的所有询问区间覆盖 ,询问的答案就是 了,我们可以二分得到 的值。
- 若 ,那么我们令接下来的所有询问区间都不覆盖 ,询问的答案就是 了,我们可以二分得到 的值。
F
没看。
就到这。
本文来自博客园,作者:lingfunny,转载请注明原文链接:https://www.cnblogs.com/lingfunny/p/18620183
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效