AtCoder Regular Contest 138
A - Larger Score
将一个 \(i\) 交换出前 \(K\) 个并将一个 \(j\) 交换进前 \(K\) 个需要的次数是 \(j-i\)。
于是只需要对于每个 \(j>K\) 找最大的 \(i\le K\) 使得 \(A_i<A_j\)。
B - 01 Generation
每次将末尾的所有 \(0\) 消去,然后只要第一个位置不是 \(0\) 就无解。否则消去第一个位置然后将整个串取反。
C - Rotate and Play Game
为什么如此困难???
考虑答案的上界,是前 \(\frac{N}{2}\) 大的数之和。由于可以自由地选起始位置,大胆猜想一定可以取到这个上界。
将前 \(\frac{N}{2}\) 大的数标为 \(-1\),其他数标为 \(1\),我们需要将整个数组循环移位使得所有前缀和均非负。这是简单的,将最小前缀和的位置移到最前面即可。
D - Differ by K bits
\(K=1\) 时是格雷码,构造是简单的。
考虑将格雷码中每个数的每一位都看作一个二进制数,也就是说有一个数组 \(b_0,b_1,\dots,b_{N-1}\),对于格雷码中的一个数 \(x\),设它当中的所有 \(1\) 位是 \(k_0,k_1,\dots,k_l\),将它映射到 \(f(x)=b_{k_0}\operatorname{xor} b_{k_1}\operatorname{xor} \dots \operatorname{xor} b_{k_l}\)。
由于相邻两个数的异或需要 \(\operatorname{popcount}=K\),所以所有的 \(b_i\) 的 \(\operatorname{popcount}\) 也都需要是 \(K\)。这些数还需要互不相同,所以 \(f(x)\) 也需要互不相同。
于是只需要找出 \(N\) 个线性无关的 \(\operatorname{popcount}=K\) 的数,将它们作为 \(b_0,\dots,b_{N-1}\) 即可。
E - Decreasing Subsequence
写了个 \(O(N^3)\) DP,结果和正解一点关系也没有,绷不住了。
对于所有 \(A_i\neq 0\) 的 \(i\),连边 \(i\to (A_i-1)\),这样形成的图是若干条从大指向小的链。一个下降子序列的形态就是 \(2K\) 个下标 \(0\le L_K<L_{K-1}<\dots<L_1<R_1<R_2<\dots<R_K\le N\),其中 \(R_i\to L_i\) 有边。
一个下降子序列是 \(2K\) 个链上的 \(2K\) 条边。将这 \(2K\) 条链从下降子序列的位置断开,设 \(i\) 为 \(2K\) 条链断开后左边部分的大小之和,\(j\) 为右边部分的大小之和。计数:
- \(\binom{n+1}{i+j}\) 枚举链上的点;
- \({i\brace K}{j\brace K}\) 枚举链划分;
- \(\sum_{x} {{n+1-i-j}\brace x}\) 枚举剩下的数的链划分。
时间复杂度 \(O(N^2)\)。
F - KD Tree
首先如果是对操作序列计数,那么可以直接区间 DP:设 \(f_{i,j,k,l}\) 表示 \(x\in [i,j],y\in [k,l]\) 的点的操作序列个数,枚举最后一次操作是什么即可 \(O(N^2)\) 转移。
沿用这个 DP 状态,但是现在是对可能被生成的排列计数。对于一个状态 \(f_{i,j,k,l}\),将这个范围内的点的 \(x,y\) 坐标分别离散化,设有 \(M\) 个点,给可能的 \(2M\) 种操作定一个顺序:\(x_1<y_1<x_2<y_2<\dots<x_K<y_K\),我们认为一个排列是被字典序最小的操作序列生成的。
设 \(g_p,h_p\) 分别表示字典序最小的第一次操作是 \(x_p,y_p\) 的可能被生成的排列个数,按照刚才定的顺序计算这些值,每次用不限制字典序最小的方案数减去钦定第一次操作是字典序更小的某个的方案数。
例如要算 \(g_p\) 时,要减去 \(g_q\)(\(q<p\))的贡献,设 \(x\) 坐标不超过 \(p\) 的点集是 \(S_p\),此时转移是 \(g_p\gets g_p-\frac{g_q}{f_{S_M\oplus S_q}}\times f_{S_p\oplus S_q}\times f_{S_M\oplus S_p}\)。
对每个 \(f_{i,j,k,l}\) 都需要做这样的步骤,总时间复杂度 \(O(N^6)\)。