题目大意:
要求设计这样一个数据结构,支持下列操作: 1.add(x,y,a),对二维数组的第x行,第y列加上a。 2.sum(l,b,r,t),求所有满足l<=x<=r,b<=y<=t,的数组元素的和。
思路:
二维的树状数组。
代码:
#include
#include
using namespace std;
#define datasize 1024
int c[datasize+1][datasize+1],n;
int lowbit(int x)
{
return x&-x;
}
int sum(int row,int col)
//输出满足(1<=x<=row,1<=y0;i-=lowbit(i))
for(int j=col;j>0;j-=lowbit(j))
s+=c[i][j];
return s;
}
void modify(int row,int col,int val)
//将元素(row,col)加上val。
{
for(int i=row;i<=n;i+=lowbit(i))
for(int j=col;j<=n;j+=lowbit(j))
c[i][j]+=val;
}
int main()
{
int op;
while(scanf("%d",&op)&&op<3)
if(op==0)
{
scanf("%d",&n);
memset(c,0,sizeof(c));
}
else if(op==1)
{
int x,y,a;
scanf("%d%d%d",&x,&y,&a);
modify(x+1,y+1,a);
}
else
{
int l,b,r,t;
scanf("%d%d%d%d",&l,&b,&r,&t);
printf("%d\n",sum(r+1,t+1)-sum(l,t+1)-sum(r+1,b)+sum(l,b));
}
}