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 要求 \(1\sim P\) 出现在 \([1, P]\),而 s 要求 \(1\sim n-S +1\) 出现在 \([S, n]\),那么 \(1\sim \min(P, n-S+1)\) 就要出现在 \([S, P]\) 中间。

\(1\sim \min(P, n-S+1)\)\(\min(P, n-S+1)\) 个数,\([S, P]\)\(P-S+1\) 个位置。

  • \(P < n - S + 1\),那么要求 \(P \le P - S + 1\),即 \(S= 1\)
  • \(P>n - S + 1\),那么要求 \(n-S+1\le P-S+1\),即 \(n=P\)

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

提交 297474190

C

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

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

提交 297489003

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

具体做法是,按照任意顺序填数,填的时候就填「相邻的、已经填过的」节点的 \(\operatorname{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']),这个可以预处理,设

\[g_{i, j} = \min_{k=0}^{m-1} f_{i, j,k} \]

于是转移是 \(O(1)\) 的,时间复杂度 \(O(nm^2)\)

提交 297515524

E

考虑用异或的性质:\(x\oplus x = 0\)。并且我们知道,一次询问的答案是 \((\mathrm{len}\ge k)\oplus (1 \text{ is in interval})\)

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

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

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

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

提交 297544693

F

没看。

就到这。

posted @ 2024-12-21 01:14  lingfunny  阅读(137)  评论(0)    收藏  举报