概述
《线段树讲解一》讲解了单点更新区间查询的线段树,现在给出一种更普适的线段树,支持区间更新区间查询。
不同做法
使用单点更新
如果我们用单点更新来模拟区间更新,容易知道,每更新一个点虽然很快,但是更新整个区间确实十分费时间的一件事。更一般的,每次更新的复杂度是$O(nlogn)$,无法达到快速应答的需求。
懒操作
懒操作是线段树的核心操作,这是线段树之所以是log级算法的原因。我们可以注意到,对于线段树上的一个节点,如果我们更新的区间已经完全覆盖了这个区间,那么我们就没必要把这个节点的子节点都更新了,如果我们询问到这个节点的时候,我们再将堆积在这里的信息往下传。
这样操作的复杂度很明显是$O(logn)$的。
如同上图中,我们试图更新$[3,7]$的区间,注意到$[4,7]$是整个节点,所以我们只需将信息保存在$[4,7]$的节点上,当我们需要知道$[4,7]$节点以下信息的时候,再将信息往下传即可。
基本操作
结构和单点更新类似,只是多了一个懒操作的标记,我们用区间增加某个值,区间询问最大值的线段树来举例子。
结构
|
|