线段树下推标记(懒惰标记,延迟标记)

解释:

理论上来说,如果[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]之类的区间的原因,所以我可以暂时不处理这些结点的修改,而是用一个懒惰标记记录下来这些结点需要进行修改这件事情。然后在之后要用到这些值的时候再进行这些操作。

猜你喜欢

转载自blog.csdn.net/abc1235454/article/details/89085545
今日推荐