可以快速求区间和等问题,查询更新复杂度都是lgn, 常数比线段树低。
一维树状数组:
long long c[100010];
int n;
inline int lowbit(int x) {
return x & -x;
}
void update(int idx, int v) {
while (idx <= n) {
c[idx] += v;
idx += lowbit(idx);
}
}
long long query(int x) {// The sum of 1 to x
long long ans = 0;
while(x > 0) {
ans += c[x];
x -= lowbit(x);
}
return ans;
}
二维树状数组:
long long BI_tree[1010][1010];
int nx, ny;
inline int lowbit(int x) {
return x & -x;
}
void update(int x, int y, int v) {
for(int i = x; i <= nx; i += lowbit(i))
for(int j = y; j <= ny; j += lowbit(j))
BI_tree[i][j] += v;
}
long long query(int x, int y) {
long long ans = 0;
for(int i = x; i > 0; i -= lowbit(i))
for(int j = y; j > 0; j -= lowbit(j))
ans += BI_tree[i][j];
return ans;
}
出处:
http://blog.csdn.net/cfarmerreally/article/details/78277979