夜もすがら君想ふ - 西沢さんP / GUMI
首先我们对操作进行转化。这个操作可以变为,每一步可以将一个空位向左 / 向右移动两格,且不越过其他空位,也不与其他空位合并。这样的话我们的目标就是尽可能地操作空位使得它们不在 S S S 中出现。注意操作显然是可逆的。
考虑对于一个棋盘和一个集合 S S S ,如何判断 S S S 是否合法。有一个这样的贪心:
首先将所有的空位尽可能的向左移动,直到无法操作。显然这样到达的最终局面是确定的。
若存在在 S S S 中出现的空位,找到最靠左的那个,将它和它后面的空位都往右移动两格。持续进行此操作直到找不到这样的空位为止。
若在上一步中出现了把空位移出棋盘的情况则 S S S 不合法,否则合法。
考虑根据这个贪心对 S S S 计数。令 k k k 为空位个数,尽可能向左移动后的最靠右的空位的位置为 p p p ,那么我们向右移动的次数不能超过 ⌊ n − p 2 ⌋ \lfloor\frac{n - p}2\rfloor ⌊ 2 n − p ⌋ 。枚举这个次数为 i i i ,然后将移动分配到每个空位上,这样会导致 S S S 中与空位产生冲突的位置被固定为 1 1 1 ,每个空位的最终位置被固定为 0 0 0 ,剩下的位置没有限制。那么可以写出式子:
∑ i = 0 ( n − p ) / 2 2 n − k − i ( k + i − 1 k − 1 ) \sum_{i = 0}^{(n - p) / 2} 2^{n - k - i} \binom{k + i - 1}{k - 1}
i = 0 ∑ ( n − p ) / 2 2 n − k − i ( k − 1 k + i − 1 )
这样可以获得 60 60 6 0 分。一次修改对 p , k p, k p , k 的影响是 O ( 1 ) \mathcal{O}(1) O ( 1 ) 的,考虑支持快速将 p , k p, k p , k 加减 1 1 1 。
F ( m , k ) = ∑ i = 0 m 2 n − k − i ( k + i − 1 k − 1 ) F ( m + 1 , k ) = F ( m , k ) + 2 n − k − m − 1 ( k + m k − 1 ) F ( m , k + 1 ) = ∑ i = 0 m 2 n − k − i − 1 ( k + i k ) = ∑ i = 0 m 2 n − k − i − 1 ( ( k + i − 1 k − 1 ) + ( k + i − 1 k ) ) = 1 2 F ( m , k ) + ∑ i = 1 m 2 n − k − i − 1 ( k + i − 1 k ) = 1 2 F ( m , k ) + ∑ i = 0 m − 1 2 n − k − i − 2 ( k + i k ) = 1 2 F ( m , k ) + 1 2 F ( m − 1 , k + 1 ) = 1 2 F ( m , k ) + 1 2 F ( m , k + 1 ) − 2 n − k − m − 2 ( k + m k ) F ( m , k + 1 ) = F ( m , k ) − 2 n − k − m − 1 ( k + m k ) F(m, k) = \sum_{i = 0}^m 2^{n - k - i} \binom{k + i - 1}{k - 1}\\
\begin{aligned}
F(m + 1, k) &= F(m, k) + 2^{n - k - m - 1} \binom{k + m}{k - 1}\\
F(m, k + 1) &= \sum_{i = 0}^m 2^{n - k - i - 1} \binom{k + i}{k}\\
&= \sum_{i = 0}^m 2^{n - k - i - 1} \left(\binom{k + i - 1}{k - 1} + \binom{k + i - 1}k\right)\\
&= \frac 12 F(m, k) + \sum_{i = 1}^m 2^{n - k - i - 1} \binom{k + i - 1}k\\
&= \frac 12 F(m, k) + \sum_{i = 0}^{m - 1} 2^{n - k - i - 2} \binom{k + i}k\\
&= \frac 12 F(m, k) + \frac 12 F(m - 1, k + 1)\\
&= \frac 12 F(m, k) + \frac 12 F(m, k + 1) - 2^{n - k - m - 2} \binom{k + m}k\\
F(m, k + 1) &= F(m, k) - 2^{n - k - m - 1} \binom{k + m}k\\
\end{aligned}
F ( m , k ) = i = 0 ∑ m 2 n − k − i ( k − 1 k + i − 1 ) F ( m + 1 , k ) F ( m , k + 1 ) F ( m , k + 1 ) = F ( m , k ) + 2 n − k − m − 1 ( k − 1 k + m ) = i = 0 ∑ m 2 n − k − i − 1 ( k k + i ) = i = 0 ∑ m 2 n − k − i − 1 ( ( k − 1 k + i − 1 ) + ( k k + i − 1 ) ) = 2 1 F ( m , k ) + i = 1 ∑ m 2 n − k − i − 1 ( k k + i − 1 ) = 2 1 F ( m , k ) + i = 0 ∑ m − 1 2 n − k − i − 2 ( k k + i ) = 2 1 F ( m , k ) + 2 1 F ( m − 1 , k + 1 ) = 2 1 F ( m , k ) + 2 1 F ( m , k + 1 ) − 2 n − k − m − 2 ( k k + m ) = F ( m , k ) − 2 n − k − m − 1 ( k k + m )
F ( m − 1 , k ) F(m - 1, k) F ( m − 1 , k ) 以及 F ( m , k − 1 ) F(m, k - 1) F ( m , k − 1 ) 只需要解方程即可,p , k p, k p , k 都可以简单地维护。那么本题时间复杂度为 O ( n + q log n ) \mathcal{O}(n + q \log n) O ( n + q log n ) ,可以通过。
Bonus:这里 有结论可以推导出:
F ( m , k ) = 2 n − m − k ∑ i = 0 m ( m + k i ) F(m, k) = 2^{n - m - k} \sum_{i = 0}^m \binom{m + k}i\\
F ( m , k ) = 2 n − m − k i = 0 ∑ m ( i m + k )
于是该问题和组合数下标求和是等价的。如果将全局询问改为区间询问,那么可以使用莫队来做到 O ( q n ) \mathcal{O}(q\sqrt n) O ( q n ) ,或者使用多项式科技做到两只 log \log log 的时间复杂度。