P10059 [CCO2022] Good Game 题解

· · 题解

官方题解对笔者而言较为抽象,本文仅提炼出了本题的解法而非解题思路。网上除了 pjudge 也找不到其他题解,组题时花了一些功夫。作为题解搬运工,对一些神奇想法的出处一概不知,所以凑合着看吧...

将原串划分为若干极长全 \tt A/\tt B 子串,例如 \tt ABBAAABBBBA 划分为 \tt A,BB,AAA,BBBB,A,发现只需要考虑两种子串:长度为 1 的 & 长度大于 1 的。

\tt 1 表示长度为 1 的子串,\tt 2 表示长度大于 1 的子串。设 TS 的划分,T 可以用 \tt 1,2 表示,例如上述串的划分 T=\tt 12221

显然,两个串的 T 相等就意味着这两串是等价的。考虑一次操作对 T 的影响:

我们略去的影响是 \tt2\to2\tt2\to1,前者是无意义的,后者不会更优,所以略去。

现在,S 能够被删空,等价于 T 可以由以上两种影响变空。

不妨将 \lvert T\rvert 分奇偶讨论。

\lvert T\rvert =2k+1

可以通过打表或者惊为天人的灵感获得结论:T 无法被删空,当且仅当 T_{k+1}=\tt1 & 至少有连续的 k\tt1 在同一个连续段。

例如,当 k=4 时,以下形式的 T 无法被删空:

X1111XXXX
XX1111XXX
XXX1111XX
XXXX1111X

证明(构造方案)是容易的。

充分性:假设整个 T 中只有这 k\tt1,左侧有连续的 l\tt2,右侧有连续的 r2,则最多删去 l+r-2\leq k-1\tt1,不止有 k\tt1 的情况就不用说了。

必要性:当 T_{k+1}=\tt2 时一直删最中间这个 \tt2 即可。若没有连续的 k\tt1,则任意两个相邻的 \tt2 下标差 \leq k。我们选择与最中间的 \tt1 的连续段相邻的两个 \tt2,例如 \tt xx21112xx,观察 T_{\frac{\lvert T\rvert+1}{2}} 如何变化:

\tt xx21{\color{red}{1}}12xx \tt x21{\color{red}{1}}2xx \tt 21{\color{red}{2}}xx

发现删除任意一边的一个 \tt2\frac{\lvert T\rvert+1}{2} 向另一边偏移一位且中间少一个 \tt1

最坏情况中间连续的是 k-1\tt1,左边的 \tt2L 的位置,右边的 \tt2L+k 的位置。只删左边的 \tt2,可以删 L-1 次,那么 \frac{\lvert T\rvert+1}{2} 对应到初始序列上的下标范围就是 [k+1,L+k],也就是说右边的 \tt2 某一时刻在 T 中的位置一定会是 \frac{\lvert T\rvert+1}{2},此时再一直删这个 \tt2 即可。

\lvert T\rvert=2k

真的要去做的话很复杂,但是...

大胆猜测,若 T 可以被删空,一定存在 T=PQ 使得 \lvert P\rvert,\lvert Q\rvert 均为奇且 P,Q 可以被删空。

假设 T 可以被删空。由于 \lvert T\rvert\geq2,经过一系列操作,最后一定有 T'=\tt22。此时有 P'=Q'=\tt2,则必然能还原出一对满足结论的 P,Q

找划分点是容易的,判断每个前后缀是否合法即可。

实现采用链表,时间复杂度 O(n)

Code