树状数组可以解决的问题:
动态前缀和问题
区间和问题
区间加问题,单点查询问题
一维树状数组:
int d[10005],n;//原数组长度
int lowbit(int x)
{
return x&(-x);
}
int query(int x)//查询前缀和
{
int res = 0;
while(x)
{
res += d[x];
x -= lowbit(x);
}
return res;
}
void add(int x,int v)//对a[x]进行修改,后面的每一个后缀和都会变化
{
while(x <= n)
{
d[x] += v;
x += lowbit(x);
}
}
二维树状数组
解决 前缀子矩阵的和,矩阵区间的和问题等
int d[301][301];
void upadte(int x,const int &y,const int &v)
{
for(; x <= n; x += (x&(-x)))
{
for(int j = y; j <= n; j+= (j&(-j)))
d[x][j] += v;
}
}
int getsum(int x,const int &y)//查询子矩阵的前缀和
{
int res = 0;
for(; x; x -= (x&(-x)))
{
for(int j = y; j; j -= (j&(-j)))
res += d[x][j];
}
return res;
}