线段树之所以称为“树”,是因为其具有树的结构特性。线段树由于本身是专门用来处理区间问题的。对于每一个子节点而言,都表示整个序列中的一段子区间; 对于每个叶子节点而言,都表示序列中的单个元素信息; 子节点不断向自己的父亲节点传递信息,而父节点存储的信息则是他的每一个子节点信息的整合。 线段树就是分块思想的树化,或者说是对于信息处理的二进制化——用于达到O(logn)
级别的处理速度。
虽然线段树好像很快,但是它只能维护带有结合律的信息。
(1) 总数字之和 = 左区间数字之和+右区间数字之和;
(2) 总GCD = gcd(左区间GCD,右区间GCD );
(3) 总最大值 = max(左区间最大值,右区间最大值)
一个节点维护一个区间:
(1)每个节点的左右儿子是谁
(2)每个节点维护的区间是哪个
(3)每个节点要维护的区间信息(如 sum)
区间修改:
(1) 如果整个区间被包含就修改整个区间,否则分裂区间,递归处理子区间后再回溯处理父节点代表的区间。
(2) 懒标记:如果每次递归处理到叶子节点,复杂度不行,父节点表示的区间是左右儿子的整合,我修改父节点表示的区间,先打个标记,下次如果修改到下面的子区间,因为打了标记,我就会把以前的修改顺带做了,并且把懒标记传递下去