杂题选做
Juggler’s Trick
题意:一个包含 R ,B , W 的序列,W 可以选择变成 R 或 B ,每次可以删除一个包含 \(r\) 个 R ,\(b\) 个 B 的连续段,并将前后相连。问最多删多少次。
Solution:
结论:如果一个长度为 \(k(r+b)\) 的区间内有 \(kr\) 个 R 和 \(kb\) 个 B ,那么这个区间一定可以被 \(k\) 次删完。
只需证明每个符合条件的区间内都有一个可删的区间即可。
维护每个点往前 \((r+b)\) 个格子内 B 的数量 \(S_i\),如果不存在可删的区间就一定没有 \(S_i=b\) ,由于 \(S_i\) 是连续的,而 $\forall i , S_i<b $ 会使总个数小于 \(kb\) ,反之 \(\forall i , S_i > b\) 会使总个数大于 \(kb\) 。
利用这个结论可以得到一个朴素的 \(O(n^2)\) DP,考虑优化。
记 B 和 W 个数的前缀和分别为 \(S_i , F_i\) ,则有转移条件为
\[\begin{cases}
S_r - S_{l-1} + F_r - F_{l-1} &\ge (r-l+1)\frac{B}{R+B} \\
S_r - S_{l-1} &\le (r-l+1)\frac{B}{R+B}
\end{cases}
\]
改写一下变成
\[\begin{cases}
S_{l-1}+F_{l-1}-(l-1)\frac{B}{R+B} &\le S_r + F_r - r \cdot \frac{B}{R+B} \\
S_{l-1} - (l-1) \frac{B}{R+B} &\le S_r - r \cdot \frac{B}{R+B}
\end{cases}
\]
等号两侧的式子分别只跟 \(l-1\) 和 \(r\) 有关系。
发现这是偏序关系的,可以用 CDQ,三维偏序的做法优化转移。
注意还有一种转移是 \(f_{i} \rightarrow f_{i+1}\) ,具体实现在每次 \(\operatorname{solve}(l,mid)\) 后先完成转移,有 \(f_{mid+1} \leftarrow f_{mid}\) ,最后再 \(\operatorname{solve}(mid+1,r)\) 。

浙公网安备 33010602011771号