二维树状·数组 讲解:https://blog.csdn.net/qq_18661257/article/details/47347995
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define maxn 1020 int n; int c[1050][1050]; int a[1050][1050]; int lowbit(int x) { return (x&(-x)); } int add(int x,int y,int val) { for (int i=x;i<=maxn;i+=lowbit(i)) for (int j=y;j<=maxn;j+=lowbit(j)) c[i][j]+=val; } int que(int x,int y) { int ans=0; for (int i=x;i>0;i-=lowbit(i)) for (int j=y;j>0;j-=lowbit(j)) ans+=c[i][j]; return ans; } int getSingle(int x, int y) { return que(x, y) + que(x-1, y-1) - que(x-1, y) - que(x, y-1); } int main(){ //freopen("in.txt","r",stdin); int t,KASE=1; scanf("%d",&t); while(t--){ printf("Case %d:\n",KASE++); memset(c,0,sizeof(c)); for(int i=1;i<=maxn;i++) for(int j=1;j<=maxn;j++){ add(i,j,1); } scanf("%d",&n); for(int i=0;i<n;i++){ getchar(); char op; scanf("%c",&op); int x1,y1; if(op=='S') { int x2,y2; scanf("%d%d%d%d",&x1,&y1,&x2,&y2); if(x1>x2)swap(x1,x2); if(y1>y2)swap(y1,y2); printf("%d\n",que(x2+1,y2+1)-que(x1,y2+1)-que(x2+1,y1)+que(x1,y1)); } else if (op=='A'){ int n1; scanf("%d%d%d",&x1,&y1,&n1); add(x1+1,y1+1,n1); } else if(op=='D'){ int n1; scanf("%d%d%d",&x1,&y1,&n1); n1=min(n1,getSingle(x1+1,y1+1)); add(x1+1,y1+1,-n1); } else{ int x2,y2,n1; scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&n1); n1=min(n1,getSingle(x1+1,y1+1)); add(x1+1,y1+1,-n1); add(x2+1,y2+1,n1); } } } return 0; }