zoukankan      html  css  js  c++  java
  • 线段树的懒惰标记小笔记

    线段树可以进行区间更新,但是相比较于普通的线段树单点更新和区间查询的功能来说,区间更新与其最大的不同就是在与区间更新需要加一个懒惰标记,来记下对懒惰标记的理解。

    懒惰标记用来干什么?

    解释:

    理论上来说,如果[3, 9]这个区间被修改的话,那么下图中的所有绿色的结点的值都要得到重新计算的:

     

     

    但是实际上是没有必要这么做的——我们可以引进一种叫做Lazy Tag,即延迟标记的东西——的确对于[3, 9]这样一次修改操作,我可以只去修改如下图中橙色的结点,但是在这个基础上,我要在[3, 9]分解出的4个区间[3, 3], [4, 5], [6, 8], [9, 9]所对应的结点上做一个延迟标记,表示“之前有一次操作需要将这棵子树中的所有结点的价格都进行修改,但是因为还没有用到这棵子树中的值所以我暂时不去修改”,

     

    但是这些懒惰标记(即延迟标记,以下将不在区分二者)又有什么用呢?

    其实就是一个暂时不处理,等到需要用到的时候再进行处理的思想。比如你之前说道的询问了[6, 7]这个区间,那么我再从上往下分解的时候,你会发现[6, 8]这个区间上有一个懒惰标记,那么你就应该进行一个懒惰标记的‘下放操作’——也就是说去修改[6, 8]这个结点的左右儿子的值,并且同时给左右儿子添加上新的懒惰标记,然后将[6, 8]的懒惰标记去掉。

    也就是说——本来[6, 8]的左右儿子早在之前的修改操作中就需要一同进行修改的,但是因为还没有用到单独的[6, 7],[8, 8]之类的区间的原因,所以我可以暂时不处理这些结点的修改,而是用一个懒惰标记记录下来这些结点需要进行修改这件事情。然后在之后要用到这些值的时候再进行这些操作。

    原博客:https://blog.csdn.net/Tong_zhi/article/details/82683219

  • 相关阅读:
    Android应用中使用自定义文字
    Linux下diff使用简介
    Android扫描SD卡中的文件
    onActivityResult不起作用?可能是和你的launchMode有关!
    修改SlidingMenu,使其能够完美运行
    eclipse快捷键说明
    XP下Virtualbox虚拟Ubuntu共享文件夹设置
    记一次调用RefreshObjectCaches刷新节点上的文件内容
    idea快捷键之遍历
    word转pdf
  • 原文地址:https://www.cnblogs.com/wushengyang/p/11194456.html
Copyright © 2011-2022 走看看