说一下我在考场上写的思路,不一定正确。
首先,最优策略一定是翻按照正面数字正序排序后的前后缀。
所以,我们可以预处理出只翻第 1,1∼2,1∼3,⋯,1∼m 张牌(即前 m 张)的最大最小值 LMax(i),LMin(i),以及只翻第 n,n−1∼n,n−2∼n,⋯,n−m+1∼n 张牌(即后 m 张牌)的最大最小值 RMax(i),RMin(i)。特别的,LMin(0)=RMin(n+1)=a1正面,LMax(0)=RMax(n+1)=an正面。这部分可以用一个 set 维护,复杂度 O(mlogm)。
然后枚举 i,j 表示翻前 i 张和后 j 张。此时的极差
F(i,j)=(LMax(i)=an正面)?max{LMax(i),RMax(j)}:RMax(j)−(RMin(j)=a1正面)?min{LMin(i),RMin(j)}:LMin(i)
PS. 这里的 Latex 可能有一些不规范,由于我还没系统学习过高中数学,导致我不知道 if 判断用数学符号怎么表示,就先把 c++ 里的三元运算符借用过来了。
但是这样做的复杂度为 O(n2logn) 太高了过不去,必须优化一下。我们可以用一种类似前缀和的方法维护 RMaxi−RMini 的后缀最小值的下标 Pi。这样就可以避免枚举 j。
上面可能没说清 Pi 的意思。Pi 为满足 minj=in{RMax(j)−RMin(j)}=RMax(Pi)−RMin(Pi) 条件的最大值。
此时的答案为:
i=0minm{(LMax(i)=an正面)?max{LMax(i),RMax(Pi+1+n−m)}:RMax(Pi+1+n−m)−(RMin(Pi+1+n−m)=a1正面)?min{LMin(i),RMin(Pi+1+n−m)}:LMin(i)}
总复杂度 O((m+n)logm),常数有点大,不过开了 O2 应该能过。