前言:
现在手上有一个数组a[n],让我们来求一个区间的和
这简直太简单了!
我们写一个前缀和就可以在O(1)解决问题了!
问题升级:
有两种操作,一个是修改其中某个变量的值,
另一个是求区间和
这。。我只能O(n²)去做了==
别怕, 线段树可以解决你的问题。
线段树–Segment Tree
既然是线段树,那么一定具有一个树的结构。
这个树和其他树不一样,线段树是用来维护我们手中的数组的
树的结点有这么几个属性:l,r,w
l代表left,是这个结点对应区间的左端点
r代表right,是这个结点对应区间的右端点
w代表这个区间内的区间和
struct node{
int l;
int r;
int w;
}tree[maxn];
那我们来想一下大致的过程吧:
首先我们要对于初始的数组a[n]来把这个线段树建立起来
然后,如果要修改一个值,我们就要修改对应叶子结点和它所有的父节点
查找区间和emmm
把一个大区间分成许多我们维护的小区间就好了~