CF 2189E Majority Wins?
只是写一下我的证明。(怎么有 OJ \(4\) 篇题解都没有证明的😂)
考虑一次选择了长度为 \(l\) 的区间,字符串总长会减少 \(l - 1\)。
对于过程中选择的区间长度 \(l_1, l_2, l_3, \cdots, l_k\),会使字符串总长减少 \(\sum\limits_{i = 1}^k l_i - k = n - 1\),所以最后的代价就是 \(\sum\limits_{i = 1}^k = n - 1 + k\)。
由此看出,最小化操作次数就最小化了代价。
首先对于无解是好判断的,就是字符串全 \(0\)。
这是因为如果存在 \(0, 1\) 就必定存在相邻的 \(01\),然后可以消为 \(1\),所以最后一定字符串一定是可以操作到全 \(1\) 的,此时再消为 \(1\),一定有解。
其次如果字符串长度 \(> 1\) 时至少都要进行一次操作变为 \(1\) 个 \(1\),所以只有 \(n = 1\) 时答案为 \(n - 1 = 0\)。
接下来考虑只需要一次操作的条件。
这一次操作就只能是一次性操作 \([1, n]\),条件即为 \(\sum\limits_{i = 1}^n [s_i = 1] \ge \sum\limits_{i = 1}^n [s_i = 0]\)。
刚刚的条件涉及到了 \(0, 1\) 数量的比较,这启发把 \(0\) 视作 \(-1\),\(1\) 视作 \(1\),做整个序列的前缀和 \(p_{1\sim n}\),上述条件即为 \(p_n\ge 0\)。
首先根据上文有解的证明,可以知道操作次数的一个上界是 \(\max(-p_n, 0) + 1\),这是因为可以每次操作选中一个相邻的 \(01\) 然后消为 \(1\),此时 \(p_n\gets p_n + 1\),最后还需要一次操作让整个串消为 \(1\)。
考虑如果是消为 \(1\),那么选中的区间的带权和需要 \(\ge 0\),消完会变为 \(1\),\(\Delta p_n\) 就至多为 \(1\),这说明如果是消为 \(1\),上述操作已经是最优的操作了。
然后来考虑消为 \(0\),选中的区间带权和需要 \(\le 0\),消完会变为 \(-1\)。
而且因为带权和 \(\ge 0\) 时消为 \(0\) 的 \(\Delta p_n < 0\),但每一个有解且 \(p_n\le 0\) 的情况都一定能找到 \(\Delta p_n > 0\) 的操作(消为 \(1\)),所以此时一定不优,于是可以把选中的区间带权和限制变松,变为任意区间。
并且因为 \(0\) 操作的 \(\Delta p_n\) 更大,而如果 \(0\) 操作包含了被消为 \(1\) 的值,会发现此时还不如直接去掉消为 \(1\) 的操作而是直接让 \(0\) 操作覆盖,所以可以认为会先进行 \(0\) 操作再进行 \(1\) 操作。
此时考虑加上消为 \(0\) 再分析一轮上界,发现可以对于任意一个 \(1\) 的两侧直接消为 \(0\),然后再用两步操作实现 \(010 \to 10 \to 1\),于是操作数至多为 \(4\)。
那么只需要找到最小操作数为 \(2, 3\) 的判定即可,剩下的情况就是为 \(4\) 的。
因为此时涉及到把一个区间变为 \(0, 1\) 并对应更改前缀和的值,这启发把 \(p_{1\sim n}\) 的折线画出来,那么这个操作就可以看作把 \([l, r]\) 这段折线删掉并平替为一段斜率为 \(-1 / 1\) 的线段,然后把两侧接起来。
对于下面说的各种条件,可以自己把条件放在折线上看,会很直观。
下记 \(0 / 1\) 操作分别为消为 \(0 / 1\) 的操作。
-
最小操作数为 \(2\):
-
\(p_n = -1\),这是用 \(2\) 次 \(1\) 操作。
-
\(\exist i\in [1, n], p_i > 0 \lor p_n - p_{i - 1} > 0\)。
这是因为无法 \(1\) 步操作就消为 \(1\),所以最后 \(1\) 次操作前串的长度一定 \(> 1\),那么最后 \(1\) 次就只能用来消整个串,那么就需要用 \(1\) 次 \(0\) 操作使 \(p_n \ge 0\)。此时可以放在折线上考虑,发现若 \(p_i > 0\),那么可以直接删掉 \([i + 1, n]\) 的部分变为一个 \(-1\);若 \(p_n - p_{i - 1} > 0\) 则可以删掉 \([1, i - 1]\) 变为一个 \(-1\)。所以操作后 \(p_n\) 一定会 \(\ge 0\),充分性得证。
对于必要性,考虑不满足此条件的 \(p_{1\sim n}\),那么此时 \(\forall i\in [1, n), p_i\in [p_n, 0]\),这说明对于任意一个区间,这个区间的和至少为 \(p_n\),故 \(\Delta p_n\le -p_n - 1\),不可能达成目标。
-
-
最小操作数为 \(3\):
-
\(p_n = -2\),这是用 \(3\) 次 \(1\) 操作。
-
\(\exist i\in [1, n], p_i = 0 \lor p_n - p_{i - 1} = 0\)。
与上面的部分基本相同,此时相当于是要用 \(2\) 次操作使 \(p_n\ge 0\) 最后再用一次 \(1\) 操作,这里先考虑 \(1\) 次 \(0\) 操作 \(1\) 次 \(1\) 操作。若 \(p_i = 0\),则可以删掉 \([i + 1, n]\) 变为 \(-1\) 使 \(p_n = -1\),然后用 \(1\) 次 \(1\) 操作使 \(p_n = 0\);若 \(p_n - p_{i - 1} = 0\),则可以删掉 \([1, i - 1]\) 变为 \(-1\) 使 \(p_n = -1\),然后用 \(1\) 次 \(1\) 操作使 \(p_n = 0\)。因为此时 \(i\in [1, n]\),所以保留下的部分不为空,且这部分和为 \(0\) 所以一定存在 \(1\),也就一定可以进行 \(1\) 操作。
必要性的证明是类似的,考虑此时 \(\forall i\in [1, n), p_i\in (p_n, 0)\),所以对于任意一个不为 \([1, n]\) 的区间,这个区间的和至少为 \(p_n + 1\),故 \(\Delta p_n\le -p_n - 2\),不可能达成目标。
-
\(\exist i\in [1, n), s_i = s_{i + 1} = 1\)。
这里是考虑用 \(2\) 次 \(0\) 操作使 \(p_n\ge 0\) 最后再用 \(1\) 次 \(1\) 操作。此时就需要删掉两个区间,满足保留的区间中一定有 \(1\),且删掉这两个区间变为 \(2\) 个 \(-1\) 后要有 \(p_n\ge 0\)。
考虑这两个区间,如果第 \(2\) 个区间包含了第 \(1\) 个区间变为的 \(0\),那一定不如直接 \(1\) 次操作直接变为 \(0\),所以这两个区间一定不交。此时因为最小操作数不为 \(2\),所以有 \(\forall i\in [1, n), p_i\in [p_n, 0]\)。
考虑区间分别为 \([l_1, r_1], [l_2, r_2]\),要使 \(p_{r_1} - p_{l_1 - 1} + p_{r_2} - p_{l_2 - 1}\le p_n - 2\)。
若 \((r_1, l_2)\) 内没有 \(1\),那么还不如合并成 \(1\) 个区间和更小,所以此时一定满足剩余部分有 \(1\) 的限制。
再接着考虑,因为 \(p_{l_1 - 1}\in [p_n, 0]\),于是一定不优于 \(l_1 = 0\) 时的 \(p_{l_1 - 1} = 0\);因为 \(p_{r_2}\in [p_n, 0]\),于是一定不优于 \(r_2 = n\) 时的 \(p_{r2} = p_n\)。于是通过调整法,条件转化为 \(p_{r_1} - 0 + p_n - p_{l_2 - 1}\le p_n - 2\),即 \(p_{r_1} - p_{l_2 - 1}\le -2\),因为此时 \((r_1, l_2)\) 中有 \(1\) 说明 \(r_1 < l_2 - 1\),于是可以转为一对 \((l, r)(l\le r)\) 满足 \(p_r - p_{l - 1}\ge 2\)。
这个条件的充要条件就是存在相邻的 \(2\) 个 \(1\)(必要性考虑 \(01\) 交错和 \(\le 1\),有 \(0\) 相邻和只会更小)。
-
直接 \(\mathcal{O}(n)\) 判断以上条件即可。

浙公网安备 33010602011771号