线段树可以进行区间更新,但是相比较于普通的线段树单点更新和区间查询的功能来说,区间更新与其最大的不同就是在与区间更新需要加一个懒惰标记,来记下对懒惰标记的理解。
懒惰标记用来干什么?
解释:
理论上来说,如果[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]之类的区间的原因,所以我可以暂时不处理这些结点的修改,而是用一个懒惰标记记录下来这些结点需要进行修改这件事情。然后在之后要用到这些值的时候再进行这些操作。