[HEOI2014]南园满地堆轻絮(无代码)

例题

题目

做法

做法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 2y2y1 ,那么只需要证明这个最小变化可以推广到 [ 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,x11],[x2+1,n] ,显然,结论成立。(省略具体细节,因为确实比较显然,当然,这里需要用到上面提到的定理来处理一下)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值