11.13
Swap Characters
这是正难则反吗?
从最终状态入手,如果它到起始状态所需最小步数 \(\le k\),那么这就是一个合法的最终状态。这个最小步数是可以贪心求得的。
而最终状态与初始状态的区别只有六种 \(a\rightarrow b,a\rightarrow c,b\rightarrow c,b\rightarrow a,c\rightarrow a,c\rightarrow b\)。
显然形如 \(a\rightarrow b,b\rightarrow a\) 这种的对换只需要一步,剩下的形如 \(a\rightarrow b,b\rightarrow c,c\rightarrow a\) 的轮换需要两步,于是可以 \(O(n^4)\) 枚举三种对换和轮换的个数,同时决定一下轮换的方向,求答案时加上组合数贡献即可。
All Pair Digit Sums
拆位考虑害人不浅!!!
如果不考虑进位那么我们的答案为所有数的数位和 \(\times2n\)。
一次进位会使答案 \(-9\),那么我们只需要求出进位的次数一减就好。
两数相加如果在第 \(k\) 位发生进位,那么其一定满足 \(a+b\ge 10^{k}\),于是我们把每个数拆成 \(\log_{10}\) 个后缀,在每一位双指针求解即可。
Present
随机开题开出来一道和上面极类似还挺厉害,但是又拆位独立考虑了怎么办?
我们要求的是答案的每个数位 \(1\) 的个数。
设 \(c_i\) 为二进制第 \(i\) 位为 \(0\) 的数的个数,\(d_i\) 为二进制第 \(i\) 位为 \(1\) 的数的个数。
那么当前位的 \(1\) 的个数即为 \(c_i\times d_i\),但还要考虑低位向这一位进的 \(1\) 的数量,求法和上面一样。
Distinct Numbers
\(\textbf{Conclusion: }\) 若 \(\exists S\to T\) 满足 \(\forall T\to P\) 都有 \(S\to P\),则 \(S\) 为必胜态。(用中文讲:一个状态能到达它所能到达的状态所能到达的状态,则这个状态为必胜态。)
\(\textbf{Prove: }\) 若 \(T\) 为必败态,则 \(S\) 为必胜态。若 \(T\) 为必胜态,则必定 \(\exists P\) 是必败态,\(\because S\to P\),\(\therefore S\) 是必胜态(它能到达一个必败态)。
Happy New Year
保证了 \(k\le 8\),所以我们可以存下当前点的被覆盖状态,后面的 \(dp\) 很平凡。
Flipping Range
建议以后看到对定长区间进行操作直接考虑对定长取模。
按 \(k\) 建立同余系,把原序列抽离为 \(k\) 个子序列。每个子序列直接是相互独立的,而且同一子序列的两个负号可以抵消,因此最终答案只与子序列上负号数量的奇偶性有关。又因为每次单独的区间操作会把连续的 \(k\) 个元素一起取反,所以它正好会把所有子序列的奇偶性改变,于是可能的情况只有两种,分别计算出答案取 max 即可。时间复杂度线性。