树状数组(Binary Indexed Tree(BIT), Fenwick Tree)是一个查询和修改复杂度都为log(n)的数据结构。主要用于查询任意两位之间的所有元素之和,但是每次只能修改一个元素的值;经过简单修改可以在log(n)的复杂度下进行范围修改,但是这时只能查询其中一个元素的值。
对于
10个数1到10,关于树状数组的建立:
x x*(-x)lowbit 第三行对应的x前lowbit位的之和
1 1 1
2 2 3
3 1 3
4 4 10
5 1 5
6 2 11
7 1 7
8 8 36
9 1 9
10 2 19
构建树状数组
void add(int x,int num){//构建数组
while(x<=n){
c[x]+=num;
x += x&(-x);
}
}
查询树状数组
int query(int x){//统计前x的和是多少
int ans = 0;
while(x>0){
ans+=c[x];
x-= x&(-x);
}
return ans;
}