题目大意
给定一个N*N的网格,刚开始每个网格的值都是0,接下来会对这些网格进行操作,有一下两种操作:
1、”X Y A“对网格C[x][y]增加A
2、”L B R T“ 查询所有(L<=X<=R,B<=Y<=T)的网格C[X[Y],并返回它们的总和
题解
非常经典的二维树状数组题目,直接看代码吧
代码
#include<iostream> #include<cstdio> #include<cstring> #include<string> #define MAXN 1050 using namespace std; int c[MAXN][MAXN]; int n; int lowbit(int x) { return x&-x; } int sum(int x,int y) { int i,j,ret=0; for(i=x;i>0;i-=lowbit(i)) for(j=y;j>0;j-=lowbit(j)) ret+=c[i][j]; return ret; } void add(int x,int y,int d) { int i,j; for(i=x;i<=n;i+=lowbit(i)) for(j=y;j<=n;j+=lowbit(j)) c[i][j]+=d; } int main(void) { int a,j,lb,x1,y1,x2,y2,ans; while(cin>>a>>n) { memset(c,0,sizeof(c)); while(scanf("%d",&lb)==1&&lb!=3) { if(lb==2) { ans=0; scanf("%d%d%d%d",&x1,&y1,&x2,&y2); x1++; y1++; x2++; y2++; ans+=sum(x2,y2); ans-=sum(x1-1,y2); ans-=sum(x2,y1-1); ans+=sum(x1-1,y1-1); printf("%d\n",ans); } else { scanf("%d%d%d",&x1,&y1,&j); x1++; y1++; add(x1,y1,j); } } } return 0; }