树状数组相对线段树来说,coding难度小很多。虽然用处不及线段树,但也能解决相当一部分问题。
参考http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=binaryIndexedTrees这篇文章,找到两个遗漏的点。
1、查找sum(i) == k的i。由于树状数组的特性,我们可以从最高位bit来依次确定。效率是log(n),但要注意和二分法差别很大。
2、二维树状数组。
#include <iostream>
#include <cstdio>
using namespace std;
const int N = 10000;
int a[N][N];
int nx = 100;
int ny = 100;
int lowbit(int k)
{
return k & -k;
}
int sum(int x,int y)
{
int ans = 0;
while ( x > 0)
{
int y1 = y;
while ( y1 > 0)
{
ans += a[x][y1];
y1 -= lowbit(y1);
}
x -= lowbit(x);
}
return ans;
}
void add(int x,int y,int w)
{
while ( x <= nx)
{
int y1 = y;
while (y1 <= ny)
{
a[x][y1] += w;
y1 += lowbit(y1);
}
x += lowbit(x);
}
}
int main()
{
return 0;
}