思路:就是一个很普通的二维树状数组,注意的是x1,y1不一定在x2,y2的左下方。
#include<iostream> #include<cstring> #include<algorithm> #include<cstdio> #define Maxn 1105 #define lowbit(x) (x&(-x)) using namespace std; int C[Maxn][Maxn],n=1010,LIST[Maxn][Maxn]; int Sum(int i,int j) { int sum=0; int y; y=j; while(i) { j=y; while(j) { sum+=C[i][j]; j-=lowbit(j); } i-=lowbit(i); } return sum; } void update(int i,int j,int val) { int y,z; y=j; while(i<=n) { j=y; while(j<=n) { C[i][j]+=val; j+=lowbit(j); } i+=lowbit(i); } } int main() { int x1,x2,y1,y2,q,t,num,i,Case=0,j; char str[2]; for(i=1;i<=1005;i++) for(j=1;j<=1005;j++) update(i,j,1); for(i=1;i<=1005;i++) for(j=1;j<=1005;j++) LIST[i][j]=C[i][j]; scanf("%d",&t); Case=0; while(t--) { memcpy(C,LIST,sizeof(C)); scanf("%d",&q); printf("Case %d:\n",++Case); for(i=1;i<=q;i++) { scanf("%s",&str); if(str[0]=='S') { scanf("%d%d%d%d",&x1,&y1,&x2,&y2); x1++,y1++,x2++,y2++; int a1,b1,a2,b2; a1=min(x1,x2);a2=max(x1,x2);b1=min(y1,y2);b2=max(y1,y2); printf("%d\n",Sum(a2,b2)-Sum(a1-1,b2)-Sum(a2,b1-1)+Sum(a1-1,b1-1)); } if(str[0]=='A') { scanf("%d%d%d",&x1,&y1,&num); x1++,y1++; update(x1,y1,num); //printf("%d**\n",Sum(x1,y1)); } if(str[0]=='D') { int temp; scanf("%d%d%d",&x1,&y1,&num); x1++,y1++; temp=Sum(x1,y1)-Sum(x1-1,y1)-Sum(x1,y1-1)+Sum(x1-1,y1-1); if(temp>=num) update(x1,y1,-num); else update(x1,y1,-temp); } if(str[0]=='M') { scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&num); x1++,y1++,x2++,y2++; int temp=Sum(x1,y1)-Sum(x1-1,y1)-Sum(x1,y1-1)+Sum(x1-1,y1-1); if(temp>=num) { update(x1,y1,-num); update(x2,y2,num); } else { update(x1,y1,-temp); update(x2,y2,temp); } } } } return 0; }