Fork me on GitHub

线段树学习小结

   近期初步把线段树的一些操作给掌握了,虽然还有一些题没刷完,只有等后面再刷了。

   下面我对自己理解的线段树的一些概念或操作做一个整理:

(注:我写的线段树不习惯在结构体内用 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.离散化。。(没搞懂)

 

暂时只想到这些,以后再加,欢迎大家提意见或问题。

posted @ 2013-12-30 16:30 whatbeg 阅读(...) 评论(...) 编辑 收藏