P12429 Sol || 这是个题吗

· · 题解

最终的 b 形态一定是所有极长的相等段上下交替。朴素的 DP 是 dp_{i,j,0/1} 表示前 i 个处理完,b_i=j,当前的 b_i 相等段为下/上时的最小代价。

容易转移:dp_{i,j,0}=\min(\min\limits_{k>j}\{dp_{i-1,k,1}\},dp_{i-1,j,0})+|a_i-j|dp_{i,j,1}=\min(\min\limits_{k<j}\{dp_{i-1,k,0}\},dp_{i-1,j,1})+|a_i-j|

光是状态数就爆炸了,显然需要从 DP 性质入手。

有聪明的选手猜了一下 j 只可能取某个 a_x,没拿到什么分。

有更聪明的选手猜了一下 j 只可能取某个 a_x-1,a_x,a_x+1,获得了 O(n^2) 的分。

有非常聪明的选手猜了一下 j 只可能取某个 [i-O(1),i+O(1)] 内的 xa_x-1,a_x,a_x+1,获得了满分。

我估计一个合理的猜测思路是,手玩感觉取到 a_x-2,a_x+2 没什么含义,然后做 a_i<a_{i+1} 的分发现长度超过 2 的连续段一定可以被替换成其它情况,于是就猜到了。

下证:DP 中每个 i 只保留 jx\in[i-4,i+4]a_x-1,a_x,a_x+1 的情况不影响答案正确性。证明大部分参考自官方题解,一些图示可以对着官方题解看一看,这里就不贴了。

考虑最终的 b 形态。

如果 [l,r] 满足其中没有任何 i 使 a_i=b_i,则称其为坏区间;称 b_i 中,大于两侧值的一段极长的相等区间 [l,r] 为峰,小于两侧为谷。称峰/谷的高度为对应的 b_i 值。

一定存在一个代价最优的 b 满足:

相信有了这个结论之后你是知道怎么写代码的。

哎其实感觉证明还是比较有意思的,只是这种结论出现在 OI 题里区分度就成玄学了,不过 BOI 场上好像也没几个人想到这东西。

但有人把这个阈值取 2 也过了。应该是情况还可以继续进行一些非人力所可及的细分。