ARC184C 做题记录
我们考虑所有编号为奇数的折痕,其形如 VMVMVM...
,其中 V
表示下凹,M
为上凸。这个可以证明:
-
归纳证明。考虑第一个折痕,其在最后一次对折时产生,显然为
V
。 -
假设前 \(2^c - 1\) 条奇数编号的折痕形如
VMVMVM...
,第 \(2^c\) 条折痕会将前面这些折痕对称过去并取反(例如会在VMVMVMV
末尾接上MVMVMVMV
,变为VMVMVMVMVMVMVMV
),因此前 \(2^{c+1} - 1\) 条奇数编号的折痕也满足这个结构。
类似的,我们可以推广这个结论:对于任意一个 \(c(0\le c\le 99)\),拎出所有编号的 lowbit 为 \(2^b\) 的折痕,它们的结构形如 VMVMVM...
。证明可以考虑忽略所有 lowbit 小于 \(2^c\) 的折痕,就是上面的结论。
接下来回到原问题,我们首先对 \(a_{1...n}\) 分类,分成奇数和偶数两类。
令 \(k\) 为 \(a_{1...n}\) 需要加的增量。如果 \(k\) 为奇数,则 \(a\) 中的偶数的贡献可以确定;如果 \(k\) 为偶数,则 \(a\) 中的奇数的贡献可以确定。
当 \(k\) 为偶数时,为了确定贡献是 \(0\) 还是 \(1\),我们还需要对 \(\frac {k} 2\) 的奇偶性即 \(k \bmod 4 = 2\) 或 \(k \bmod 4 = 0\) 进行分类讨论。当 \(k \bmod 4 = 0\) 时,贡献为 \(\sum\limits_{i = 1} ^ n [a_i \bmod 4 = 3]\);当 \(k \bmod 4 = 2\) 时,贡献为 \(\sum\limits_{i = 1} ^ n [a_i \bmod 4 = 1]\)。
设 \(f(a, u)\) 为对于给定的 \(a\) 序列,满足 \(k \bmod 2 = u\) 的答案。当 \(u = 0\) 即 \(k\) 为偶数时,我们还需要求所有偶数组成的序列答案,设 \(b\) 序列为 \(a\) 中所有偶数除以二组成的序列。注意有个隐性条件:当 \(k \bmod 4 = 0\) 时,从 \(f(b, 0)\) 处转移过来;当 \(k \bmod 4 = 2\) 时,从 \(f(b, 1)\) 处转移过来。
\(u = 1\) 的情况是类似的。当递归层数达到 \(\log_2 a\) 时可以直接返回,每个数至多被遍历 \(O(\log a)\) 次,时间复杂度 \(O(n\log a)\)。
- 启示:先观察必要的东西,找到必要的性质利于下一步,然后是这种二进制递归形式的 trick