这次复习树状数组主要加深了对于原理的理解。
树状数组是什么?
树状数组由3个部分组成:
1.lowbit()//求lowbit值 lowbit(x)=x&(-x)//这个比较方便,记住就好。
int lowbit(int x){
return x&(-x);
}
2.update()//修改
void update(int p,int w){
while(p<=n){
c[p]+=w;
p+=lowbit(p);
}
}
3.sum()//求和
long long int sum(int p){
long long int tot=0;
while(p){
tot+=c[p];
p-=lowbit(p);
}
return tot;
}
树状数组能干什么?
1.(一维和二维)单点修改,区间查询
2.(一维和二维)区间修改,单点查询
3.(一维和二维)区间修改,区间查询
4.(一维和二维)区间修改,区间查询
树状数组中数组C[X]的含义是什么?
C【X】表示的是[X-lowbit(x),X]的区间和。
update更新的是什么?
如果在x位加上w,每次更新c[x+lowbit(x)],其实就是从更新[1,x+lowbit(x)],所以求和的时候不会重复加上w.
单点修改怎么办?
单点修改只需要弄一个差分数组就行了。
二维树状数组:
每次操作的时间复杂度是((log(n))^2)。
(区间修改,区间查询)(区间修改,区间查询)
为什么要用差分,因为区间修改如果不用差分得每个每个修改,时间复杂度过不去。