洛谷 P13309 演剧
题意:给定长度为 \(n\) 的序列 \(\{a_n\}\)。两个人博弈,A 操作,B 后操作。每一轮,操作者可以将序列分成两段,由另一人删去其中一段。剩余一个数的时候停止。A 想让剩余数尽量大,B 想让剩余数尽量小。两个人都用最优方案,求剩余的数。\(n \le 10^5,a_i \le 10^9\)。
套路是,二分答案 \(k\),将序列中大于等于 \(k\) 的赋成 \(1\),其余赋成 \(-1\)。
A 能取到大于等于 \(k\) 的,视为 A 取到 \(1\),称作 A 赢。这样输赢就只与 \(1\) 和 \(-1\) 有关。
结论是,如果序列中 \(1\) 的个数大于 \(-1\) 的个数,即总和大于 \(0\),则 A 赢。
若总和小于 \(0\),则 B 赢。
总和等于 \(0\),若前缀和等于 \(0\) 的数量为奇数,则 B 赢。
否则 A 赢。
证明:
\(n=1\) 时显然。
假设结论对所有 \(n < k\) 成立,试说明 \(n=k\) 时也成立。
若总和大于 \(0\),那么取第一个总和为 \(0\) 的前缀(没有的时候显然直接赢了)。分成一个和为 \(0\) 的段和和 \(>0\) 的段。这里先后手轮换,可以理解成所有 \(1\) 变成 \(-1\),所有 \(-1\) 变成 \(1\)。后手取的时候相等于在一个和为 \(0\) 的段和和 \(<0\) 的段中取。应用归纳假设,可得后手输。
总和小于 \(0\) 的情形同理。
总和等于 \(0\) 时:设最多可以分成 \(x\) 段和为 \(0\) 的【不交】且【并为原序列】的子段。
\(x=1\) 时,只能分成 \(>0\) 的一段和 \(<0\) 的一段。应用归纳假设,后手必赢。
这里注意到若 \(x\) 为奇数等价于先手输。
\(x > 1\) 时,先手为了避免上面一种情况出现,只能会分成,包含 \(u\) 段和为 \(0\) 的序列,以及包含 \(v\) 段和为 \(0\) 的序列。对 \(u,v\) 分奇偶易证。
所以证毕。
代码是好写的,时间复杂度 \(O(n \log a_i)\)。

浙公网安备 33010602011771号