题目大意:
要求设计这样一个数据结构,支持下列操作: 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<=y<=col)条件下元素的和。 { int s=0; for(int i=row;i>0;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)); } }