线段树Segment Tree
理解:
线段树,一种二叉搜索树。它将一段区间划分为若干单位区间,每一个节点都储存着一个区间,每个单元区间对应线段树中的一个叶结点。可用于区间求和,区间最大值,区间修改,单点修改等操作。
时间复杂度:
修改、查询、统计:O(log(n))
具体操作再写
空间复杂度:
O(4*n)
解决问题:
但是,可以用线段树维护的问题必须满足区间加法。
e.g.
1、区间求和
2、区间最大值
反例:区间众数、区间最长不下降子序列
具体操作:
1、build
void Build(int l,int r,int rt)
{ //[l,r]表示当前节点区间,rt表示当前节点的实际存储位置
if(l==r) {//若到达叶节点
Sum[rt]=A[l];//存储A数组的值
return;
}
int m=(l+r)>>1;
//左右递归
Build(l,m,rt<<1);
Build(m+1,r,rt<<1|1);
//更新信息
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}