涂色

首先是一种对于这个问题的新的建树方法

当然也可以按照原来的建树方法建树,最后统计相邻的都被涂色的点就好了

然后注意lazy标记最开始要初始化为0,不能为1或2,为0的时候表示自己当前的操作已经全部传递给子节点了

注意lazy表示的是自己已经完成修改,但是子节点还没有修改,无论是这道题目还是普通的区间加减,我们在递归到一个节点的时候,他的所有祖先结点的lazy一定都下放了,所以当前节点的状态就是最新的状态

那么看到这道题目,当前这个节点的lazy就是就是这个节点在进行这次更新之前的最后的状态(为0表示所有操作都已经下放给子节点,自己的状态不清楚,所以要去看子节点的状态),如果为1,当然就不用再继续递归了

其实这个查询的代码有一点缺陷,叶子节点的lazy也可能是0,这时就表示这个叶子节点没被操作过,返回0即可

update 2024.5.15

这里主要是注意lazy标记的时效性,一个叶节点的状态是其到根的路径中深度最浅的节点的lazy状态

所以说代码里面,比如delete,要判断lazy为\(1\)了才下传是没必要的,其实无论如何可以直接下传(如果当前节点有状态的话)

posted @ 2023-12-18 20:38  最爱丁珰  阅读(16)  评论(0编辑  收藏  举报