线段树学习小结
近期初步把线段树的一些操作给掌握了,虽然还有一些题没刷完,只有等后面再刷了。
下面我对自己理解的线段树的一些概念或操作做一个整理:
(注:我写的线段树不习惯在结构体内用 l 和 r 这两个数据,能不建结构体就不建结构体——-- 这是我的原则。。因为我觉得那样代码不好看又麻烦。。(嘿嘿))
一、线段树的几种操作
1.单点更新,单点查询
这个是最简单的,直接查询到叶子节点(叶子节点代表一个数),然后修改,注意此时要pushup(rt),将更新传给上面的每个节点。查询的话就更好做了,在左边的话就查左边,在右边就查右边,然后当 l==r 时,表示已经到了叶子节点,此时返回tree[rt].value 。
2.单点更新,区间查询
更新跟上面的一样。查询的终止条件嘛,直接 if(aa<=l && bb >= r) 就可以返回值了,一般是返回tree[rt].value 即此段区间的值。[aa,bb] 为查询的区间。
3.区间更新,单点查询
查询上面有讲,说下区间更新就行了,区间更新往往要设一个懒标记,可以减少更新的次数,即时间复杂度,这里可能会多一个pushdown操作,即在需要查询之前把懒标记mark下传给子孙,更新子孙的值,以便查询,有点像现实生活中的应付检查。。
4.区间更新,区间查询
方法我上面已经都讲了,就不讲了。
二、线段树的应用
1.维护区间最值,更新区间或点,然后查询。
2.维护区间和值。
3.线段覆盖问题。
4.染色问题。
5.RMQ问题。
6.离散化。。(没搞懂)
暂时只想到这些,以后再加,欢迎大家提意见或问题。
作者:whatbeg
出处1:http://whatbeg.com/
出处2:http://www.cnblogs.com/whatbeg/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
更多精彩文章抢先看?详见我的独立博客: whatbeg.com