Codeforces Round 994 (Div. 2)
Codeforces Round 994 (Div. 2)
A
首先答案小于等于 \(2\)。因为对所有数取一次 mex 后,再对得到的数取一次 mex,就得到一个 \(0\)。
考虑什么时候答案为 \(0\),当且仅当所有数为 \(0\)。
什么时候答案为 \(1\),数组中前缀是 \(0\),后缀是 \(0\),中间是一段非 \(0\)。
其他情况都是 \(2\)。
B
如果存在某个 p 在 s 前面,显然无解。因为 \(1\) 不可能放到一个合理的位置。
那么考虑最左边的 p(设下标为 \(P\))和最右边的 s(设下标为 \(S\)),字符串形式如下:
s.s.s.sss....s.....p.p..p.p...p.pp
^ ^
不难发现对于这两个 s...p,p 要求 \(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\),否则无解。
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)\),这两种情况都对原构造没影响。所以奇数只需要循环移位就可以得到合法构造了。
事实上,这题有一个更强的构造。我们可以对于任意图都构造出一种合法的填数方案。
具体做法是,按照任意顺序填数,填的时候就填「相邻的、已经填过的」节点的 \(\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']),这个可以预处理,设
于是转移是 \(O(1)\) 的,时间复杂度 \(O(nm^2)\)。
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\) 是否为真。
- 若 \(k>n/2\),那么我们令接下来的所有询问区间覆盖 \([1, n / 2]\),询问的答案就是 \((\mathrm{len}\ge k)\oplus 1\) 了,我们可以二分得到 \(k\) 的值。
- 若 \(k\le n/2\),那么我们令接下来的所有询问区间都不覆盖 \([1, n / 2]\),询问的答案就是 \(\mathrm{len}\ge k\) 了,我们可以二分得到 \(k\) 的值。
F
没看。
就到这。
本文来自博客园,作者:lingfunny,转载请注明原文链接:https://www.cnblogs.com/lingfunny/p/18620183

浙公网安备 33010602011771号