zoukankan      html  css  js  c++  java
  • 线段树学习小结

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

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

    (注:我写的线段树不习惯在结构体内用 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

  • 相关阅读:
    React Native For Android 环境搭建
    MySql 打开日志文件
    PHP使用JSON通信
    PHPStorm 调式JS /同时调式PHP和jS
    PHP list,explode的使用
    PHP foreach使用
    PHP eof的使用
    使用Spring缓存的简单Demo
    android源码的目录结构
    在Ubuntu上安装LAMP服务器
  • 原文地址:https://www.cnblogs.com/whatbeg/p/3498021.html
Copyright © 2011-2022 走看看