题目链接:传送门
题意:给出操作,按照操作进行。
思路:将树状数组设置为二维的就行了。
注意:
(1)每次求出的面积是S(x2,y2)-S(x1-1,y2)-S(x2,y1-1)+S(x1-1,y1-1)。
(2)树状数组的lowbit不允许0。
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn = 2050; int c[maxn][maxn],lowbit[maxn],N; void update(int x,int y,int Item) { for(int i=x;i<=N;i+=lowbit[i]) for(int j=y;j<=N;j+=lowbit[j]) c[i][j]+=Item; } int query(int x,int y) { int sum=0; for(int i=x;i>0;i-=lowbit[i]) for(int j=y;j>0;j-=lowbit[j]) sum+=c[i][j]; return sum; } int get_ans(int x,int y,int A,int B) { return query(A+1,B+1)+query(x,y)-query(x,B+1)-query(A+1,y); } int main(void) { int i,j,x,y,A,B,pos; for(i=1;i<maxn;i++) lowbit[i]=i&(-i); while(1) { scanf("%d",&pos); if(pos==1) { scanf("%d%d%d",&x,&y,&A); update(x+1,y+1,A); } else if(pos==2) { scanf("%d%d%d%d",&x,&y,&A,&B); int ans=get_ans(x,y,A,B); printf("%d ",ans); } else if(pos==0) { scanf("%d",&N); memset(c,0,sizeof(c)); } else break; } return 0; }