题解:P13093 [FJCPC 2025] 卡牌游戏
整副牌在发牌时按奇偶编号分给两人,设奇位牌面和减偶位牌面和为 \(D\)。若 \(D=0\) 则两人必平分;若 \(D>0\) 则奇方(小 A 若拿奇位)领先 \(D\);若 \(D<0\) 则落后 \(|D|\)。小 A 想让最坏情况下自己得到的数字之和最大,即希望把 \(|D|\) 压到最小,因为最终他至少能拿到 \((\sum a_i-|D'|)/2\)。
记交替前缀和 \(P_i=\sum_{k=1}^{i}(-1)^{k+1}a_k\),那么 \(D=P_{2n}\)。抽出位置 \(i\) 的牌再插到位置 \(j\) 后,奇偶性划分发生环形位移。设 \(s_i\) 表示 \(i\) 的奇偶符号(奇为 \(+1\),偶为 \(-1\)),可推出新差值
\[D'=D-2\bigl(P_j-P_i\bigr)+a_i\bigl(s_j-s_i\bigr)
\]
目标就是在所有 \(i\ne j\) 中找 \(\min|D'|\)。等式右边与 \(2P_j\) 成一次函数关系,因此固定 \(i\) 时,只须在满足 \(j>i\) 的序列 \(\{2P_j\}\) 中寻找最接近某个常数的值即可。把所有前缀值按奇偶拆成两棵 multiset,从右向左枚举 \(i\),每次在对应集合用 lower_bound 取前驱和后继各比较一次,就能在 \(O(\log n)\) 更新答案。数组整体反转再做一次可覆盖 \(j<i\) 的情况。
时间复杂度 \(O(n\log n)\)。

浙公网安备 33010602011771号