算法—线段树

yuanheci 2022年12月06日 199次浏览

  线段树之所以称为“树”,是因为其具有树的结构特性。线段树由于本身是专门用来处理区间问题的。对于每一个子节点而言,都表示整个序列中的一段子区间; 对于每个叶子节点而言,都表示序列中的单个元素信息; 子节点不断向自己的父亲节点传递信息,而父节点存储的信息则是他的每一个子节点信息的整合。 线段树就是分块思想的树化,或者说是对于信息处理的二进制化——用于达到O(logn)级别的处理速度。

image-1670256644138

  虽然线段树好像很快,但是它只能维护带有结合律的信息。
  (1) 总数字之和 = 左区间数字之和+右区间数字之和;
  (2) 总GCD = gcd(左区间GCD,右区间GCD );
  (3) 总最大值 = max(左区间最大值,右区间最大值)


一个节点维护一个区间:
  (1)每个节点的左右儿子是谁
  (2)每个节点维护的区间是哪个
  (3)每个节点要维护的区间信息(如 sum)

区间修改:
  (1) 如果整个区间被包含就修改整个区间,否则分裂区间,递归处理子区间后再回溯处理父节点代表的区间。
  (2) 懒标记:如果每次递归处理到叶子节点,复杂度不行,父节点表示的区间是左右儿子的整合,我修改父节点表示的区间,先打个标记,下次如果修改到下面的子区间,因为打了标记,我就会把以前的修改顺带做了,并且把懒标记传递下去