Codeforces Round 994 (Div. 2)

Codeforces Round 994 (Div. 2)

A

首先答案小于等于 2。因为对所有数取一次 mex 后,再对得到的数取一次 mex,就得到一个 0

考虑什么时候答案为 0,当且仅当所有数为 0

什么时候答案为 1,数组中前缀是 0,后缀是 0,中间是一段非 0

其他情况都是 2

提交 297474064

B

如果存在某个 ps 前面,显然无解。因为 1 不可能放到一个合理的位置。

那么考虑最左边的 p(设下标为 P)和最右边的 s(设下标为 S),字符串形式如下:

s.s.s.sss....s.....p.p..p.p...p.pp
             ^     ^

不难发现对于这两个 s...pp 要求 1P 出现在 [1,P],而 s 要求 1nS+1 出现在 [S,n],那么 1min(P,nS+1) 就要出现在 [S,P] 中间。

1min(P,nS+1)min(P,nS+1) 个数,[S,P]PS+1 个位置。

  • P<nS+1,那么要求 PPS+1,即 S=1
  • P>nS+1,那么要求 nS+1PS+1,即 n=P

所以最后的条件就是 S=1n=P,否则无解。

提交 297474190

C

考虑偶数时,显然有构造 0,1,0,1,,0,1。如果 (x,y) 连接了 (0,1),对这个原构造没有影响。如果 (x,y) 连接了 (1,1),可以让其中一个 1 改为 2。如果连接了 (0,0),我们可以将构造循环移位一位,就是连接 (1,1) 了。

奇数时,有构造 2,0,1,0,1,,0,1。不难发现,我们通过循环移位,一定可以把 (x,y) 变成连接了 (2,1)(2,0),这两种情况都对原构造没影响。所以奇数只需要循环移位就可以得到合法构造了。

提交 297489003

事实上,这题有一个更强的构造。我们可以对于任意图都构造出一种合法的填数方案

具体做法是,按照任意顺序填数,填的时候就填「相邻的、已经填过的」节点的 mex 即可。

首先这个构造对于当前节点是合法的,其次对于其他已经填好的节点是没影响的,经过有穷步我们可以填完所有节点。

此方法是从 StarSilk 听来的。

D

考虑 dp。设 f[i][j][k] 表示「走到格子 (i,j),当前行(第 i 行)循环左移了 k 位」的最小花费。

主动转移有点困难,主要是 f[i][j][k] -> f[i+1][j][k']。这里的 k 可以有 m 种取值,3D/1D 时间复杂度不对。

考虑被动转移。f[i][j][k] <- f[i][j - 1][k],这个显然。f[i][j][k] <- min(f[i - 1][j][k']),这个可以预处理,设

gi,j=mink=0m1fi,j,k

于是转移是 O(1) 的,时间复杂度 O(nm2)

提交 297515524

E

考虑用异或的性质:xx=0。并且我们知道,一次询问的答案是 (lenk)(1 is in interval)

于是考虑这个表达式 ask(1,n/4)ask(n/4+1,n/2)=(1 is in (1,n/4))(1 is in (n/4+1,n/2))。这个表达式为真当且仅当 1 在区间 [1,n/2]

于是花费两次询问,我们知道 1[1,n/2] 还是 (n/2,n]。不妨设 1[1,n/2]

接下来询问 ask(n/2+1,n),这个表达式的值可以告诉我们 n/2k 是否为真。

  1. k>n/2,那么我们令接下来的所有询问区间覆盖 [1,n/2],询问的答案就是 (lenk)1 了,我们可以二分得到 k 的值。
  2. kn/2,那么我们令接下来的所有询问区间都不覆盖 [1,n/2],询问的答案就是 lenk 了,我们可以二分得到 k 的值。

提交 297544693

F

没看。

就到这。

posted @   lingfunny  阅读(111)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示