目录
1. 线段树基础
(1)什么是线段树
(2)线段树的拆分原理
(3)相关算法对比
(4)线段树的使用前提
(5)线段树建树操作
(6)线段树单点修改
(7)线段树区间查询
2. 区间修改:延迟标记与标记永久化
最后
1. 线段树基础
(1)什么是线段树
a. 线段树是:利用分治思想处理对一段序列进行大量区间操作(区间修改、区间查询)的数据结构;
b. 线段树可以在 O ( n log n ) 的时间复杂度内,完成区间修改 / 区间查询操作;
c. 线段树的叶节点即为原序列,内部节点除了左右儿子之外,还保存着其分管的某段区间信息,如:区间和、区间最值。显然,每个节点所分管的区间即为其为根的子树中所有节点。
(2)线段树的拆分原理
a. 将 [ 1, n ] 分解成若干特定的子区间;
b. 将每个区间 [ L, R ] 都分解为少量特定的子区间;
c. 通过对子区间的修改或统计,来实现快速对 [ L, R ] 区间的修改,统计。
(3)相关算法对比
算法 / 解决问题 | 区间求和 | 区间最大值 | 单点修改 | 区间修改 |
前缀和 | √ | × | × | × |
树状数组 | √ | √ | √ | × |
线段树 | √ | √ | √ | √ |
(4)线段树的使用前提
使用线段树的问题,必须符合区间加法:也就是通过合并区间的解,一定能得到问题的解。
可以使用线段树问题举例:
a. 数字和问题:总数字之和 = 左区间数字之和 + 右区间数字之和;
b. 最大公约数:总 gcd = gcd(左区间 GCD,右区间 GCD);
c. 最大值问题:总最大值 = max(左区间最大值,右区间最大值);
不能用线段树求解问题举例:
a. 众数:无法根据左右区间众数,得知总区间众数;
b. 最长连续出现的字母:无法根据左右区间的最长连续出现的字母,得知总区间的解:
(5)线段树建树操作
(6)线段树单点修改
(7)线段树区间查询
2. 区间修改:延迟标记与标记永久化
add [ k ]:延迟标记(懒标记),编号为 k 的节点的所有子节点,都增加一个值。(注意:不包含当前的节点,当前的节点会立刻将和的增量计算出来)。
当不向下递归时,当前节点就需要计算增量,并打上延迟标记。
标记下放 ( pushdown ):当需要从有延迟标记的节点向下递归时,需要将当前的延迟标记下放到子节点,并清除当前延迟标记的值。
pushup:回溯利用子节点更新父节点。
最后
制作不易,点个赞吧!!!
制作不易,点个赞吧!!!
制作不易,点个赞吧!!!