您的位置:首页 > 其它

线段树区间取max黑科技

2016-07-07 16:50 302 查看

Preface

在训练中我们常常会遇到这样一种猥琐的数据结构操作:区间取max,即将区间内小于lim的数改成lim。在这里我做一些总结。

这里只讨论线段树,分块和其它数据结构类似。

Text

Case 1

要求:兹瓷区间max,还有其它各种普通操作,查询区间和

特殊性:数值满足单调性

Solution:由于单调性,我们可以在线段树上二分出小于lim的区间,然后就变成了一个区间赋值(set)操作。

Case 2

要求:兹瓷区间max,区间加,查询极值

Algorithm 1

维护标记up,add

一个数x真实值为max(x+add,up)

∙区间max:

max(max(x+add,up),lim)=max(x+add,max(up,lim))

直接更新up标记即可

∙区间加

max(x+add,up)+delta=max(x+add+delta,up+delta)

更新add、up标记

Algorithm 2

还是相同的标记,不过x真实值为max(x,up)+add

∙区间加

max(x,up)+add+delta=max(x,up)+(add+delta)

直接更新add标记

∙区间max:

max(max(x,up)+add,lim)=max(max(x,up),lim−add)+add=max(x,max(up,lim−add))+add

直接更新up标记

参考Werkeytom_FTD的blog:http://blog.csdn.net/werkeytom_ftd/article/details/51077590

Case 3

要求:兹瓷区间max,查询区间和

没有特殊性

参考WC2016中C_Sunshine和jiry_2的课件《Segment tree Beats!》

维护最小值次小值乱搞,时间复杂度log22。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: