CF713C 及其双倍经验

文章讨论了一种优化问题的解法,通过将严格递增序列转换为非严格递增,利用优先队列存储之前值,同时通过中位数合并策略来减少操作次数。作者分享了如何通过可并堆处理单调递减段并保持中位数,以找到最优解决方案。
摘要由CSDN通过智能技术生成

思路很神,经验很足的一道题。
题目
首先记 b i = a i − i b_i=a_i-i bi=aii,然后把严格递增变成非严格递增。
用一个优先队列维护 i i i 以前的所有值,对于所有当前值大于 a i a_i ai 的值改为 a i a_i ai 然后贡献 v a l − a i val-a_i valai 的操作次数。
这个思路看起来就很不对,但是是正确的。
首先,对于一对不符合非降的 ( x , y ) (x,y) (x,y) x < y , a x > a y x<y,a_x>a_y x<y,ax>ay 肯定是将 a x a_x ax 尽量减少, a y a_y ay 尽量增加才可以使答案更优。如果不考虑 x x x 之前的 z z z 满足 a z a_z az 的最终值大于 a y a_y ay,那么就将 a x a_x ax 改为 a z a_z az。如果考虑 z z z 的话,将 a x a_x ax a y a_y ay 改为 a z a_z az 的最终值还是贡献 a x − a y a_x-a_y axay,即 a z a_z az 的最终值不影响 ( x , y ) (x,y) (x,y) 计算贡献。

要求输出方案的经验
其实感觉这种做法比前面的更好想到。
严格递增还是用上面的方法转换成非严格递增。
首先发现对于两种特殊的序列(严格递增和严格递减的序列)最终都是将所有数改为这个序列的中位数。所以将原序列分成若干个单调递减的序列,对于前一个段的中位数大于后一个段的中位数,需要合并,并改成合并后的中位数。
用可并堆维护中位数,也就是先加入一个段中的所有数,然后删除一半的数,此时最大值就是中位数。唯一担心的是如果合并前已经删除了合并后的中位数,那么就不对了。可以注意到,如果前一个段大于的中位数后一个段的,那么合并后的中位数在前一个段时则 咕咕咕

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值