基础概念:
线段树是一种二叉树。
假设有编号从1到N的N个点,用 [ L , R ] [L,R] [L,R]表示区间中的点。
线段树可以对编号连续的点进行修改或者统计操作,修改和统计的复杂度都是 O ( l o g 2 N ) O(log_2N) O(log2N)。
原理:
将 [ 1 , N ] [1,N] [1,N]分解成若干个区间 (数量不超过 4 × N 4×N 4×N), 然后,
将每个区间 [ L , R ] [L,R] [L,R]再次分解为子区间,
通过对这些子区间的修改或者统计,
来实现快速对 [ L , R ] [L,R] [L,R]进行修改或者统计。
总的来说,线段树就是将区间 [ 1 , N ] [1,N] [1,N]分成若干个子区间 [ L , M ] 和 [ M + 1 , R ] [L,M]和[M + 1, R] [L,M]和[M+1,R]。
定义一个结构体 t r e e [ 4 ∗ M a x x ] tree[4 * Maxx] tree[4∗Maxx]。
struct t {
int l; //左子树编号
int r; //右子树编号
int value; //权值
int add; //懒标记
}tree[4 * Maxx];
如图:(上图是区间和权值,下图是节点编号)