例题
做法
做法1
考虑二分答案,枚举答案为 K K K ,考虑一下如果一个位置在保证前面依旧是非递减时要怎样才能减轻后面变成非递减的压力?
显然的一件事情是要让数字变得尽量的小,直接二分+贪心。
老了老了,这个SB做法想了一个小时
O ( n log n ) O(n\log{n}) O(nlogn)
做法2
这个做法看题解的,挺妙的。
直接贪心,答案为差值最大的逆序对的一半。
时间复杂度 O ( n ) O(n) O(n)。
这个应该就是能够在 L O J LOJ LOJ AC的做法了。
当然,这个的证明我就阿巴一下吧。
定理
一个数列的最大值是 v a l m a x val_{max} valmax,存在一个最优方案使得变换后的非递减数列的最大值小于等于 v a l m a x val_{max} valmax 。
假设存在一个位置变换后的值大于了 v a l m a x val_{max} valmax ,那么变成 v a l m a x val_{max} valmax 显然只会更优或者不变。
最小值也是同理。
证明
考虑最大逆序对在数列中的位置为 x 1 , x 2 x_1,x_2 x1,x2 ,且对应的值为 y 1 , y 2 y_1,y_2 y1,y2 (注:这里要求 x 1 x_1 x1 前不存在一个值大于 y 1 y_1 y1 , x 2 x_2 x2 同理 )
那么显然,在 [ x 1 , x 2 ] [x_1,x_2] [x1,x2] 区间中最小的变化就是 ⌈ y 2 − y 1 2 ⌉ \left\lceil \frac{y2-y1}{2} \right\rceil ⌈2y2−y1⌉ ,那么只需要证明这个最小变化可以推广到 [ 1 , n ] [1,n] [1,n] 即可。
我们将 [ x 1 , x 2 ] [x_1,x_2] [x1,x2] 中的 y y y 值全部变成 ⌈ y 2 + y 1 2 ⌉ \left\lceil \frac{y2+y1}{2} \right\rceil ⌈2y2+y1⌉。
然后递归处理 [ 1 , x 1 − 1 ] , [ x 2 + 1 , n ] [1,x_1-1],[x_2+1,n] [1,x1−1],[x2+1,n] ,显然,结论成立。(省略具体细节,因为确实比较显然,当然,这里需要用到上面提到的定理来处理一下)