0%

树状数组

与线段树的区别

**1.**两者在复杂度上同级, 但是树状数组的常数明显优于线段树, 其编程复杂度也远小于线段树.

**2.**树状数组的作用被线段树完全涵盖, 凡是可以使用树状数组解决的问题, 使用线段树一定可以解决, 但是线段树能够解决的问题树状数组未必能够解决.

**3.**树状数组的突出特点是其编程的极端简洁性, 使用lowbit技术可以在很短的几步操作中完成树状数组的核心操作,其代码效率远高于线段树。

20180625080640696

lowbit

lowbit(x) —— 取出x的最低位1

1
int lowbit(x){return x&(-x);}

单点更新

1
2
3
4
void update(int x,int y,int n){
for(int i=x;i<=n;i+=lowbit(i))    //x为更新的位置,y为更新后的数,n为数组最大值
c[i] += y;
}

区间查询

单点更新的逆操作

1
2
3
4
5
6
int getsum(int x){
int ans = 0;
for(int i=x;i;i-=lowbit(i))
ans += c[i];
return ans;
}