Codeforces Round 1002 (Div. 2)
A
显然只要两个数组的颜色数都至少是 2 或者有一个至少是 3 即可。
B
考虑答案何时为 1,只需要偶数段中第一个数不为 1。
枚举这个位置 \(2\le i\le n-k+2\),只要存在 \(a_i\neq1\) 答案就是 1。
否则,\(\forall 2\le i\le n-k+2,a_i=1\)。只要 \(2<n-k+2\) 答案就是 2。
否则,\(n-k+2=2\),即 \(k=n\),模拟一遍即可求出答案。
C
相当于将给定二维数组后缀和后选择一些位置,每一行选恰好一个,从第二列开始每一列选恰好一个,使得这些位置上数的 mex 最大。
首先发现 \(i\) 只会在倒数第 \(i+1\) 列选,归纳法易证。
于是相当于给定若干个集合,要在每个集合中选一个数,且选的数两两不同。
这个很难做,但是注意到 \(\sum_{k=j}^{m}a_{i,k}=m-j+1\) 的必要条件是 \(\sum_{k=j+1}^{m}a_{i,k}=m-j\),所以这些集合具有包含关系,从前向后贪心即可。
D
显然最后会在一条边上绕,需要两张图中都有这条边存在且棋子能够同时到达某个端点。
设 \(f_{i,j}\) 表示两个棋子分别移到 \(i,j\) 所需的最小代价,转移显然。
这个 DP 共有 \(O(n^2)\) 个状态,\(O(m^2)\) 个转移,使用 dij 即可做到 \(O((n^2+m^2)\log m^2)\)。
E1(补)
要最大化在移到目标数组对应位置的数的个数,这些数在原数组中一定对应一个前缀。
考虑如何判断一个前缀是否合法,首先这些元素要在目标数组中升序出现,并且对于每个后面要插入新数的元素 \(a_{i,j}\),前面插入新数总数至少要是 \(m-j\),这样就一定存在一个时刻使得这个元素后面的空在行首。
直接维护即可。
E2(补)
每次选择最后一个能插入的插入,使用线段树维护“要插入到这个空前面的空最少还要插入多少次”即可。

浙公网安备 33010602011771号