碰到这种题一定要注意坐标是不是有序的,也要注意坐标是不是有0的,有的话需要+1处理
#include<bits/stdc++.h> using namespace std; #define maxn 1005 int bit[maxn][maxn],flag[maxn][maxn]; char op[5]; void add(int x,int y,int num){ for(int i=x;i<=1002;i+=i&-i) for(int j=y;j<=1002;j+=j&-j) bit[i][j]+=num; } int query(int x,int y){ int res=0; for(int i=x;i;i-=i&-i) for(int j=y;j;j-=j&-j) res+=bit[i][j]; return res; } int main(){ int m,x1,y1,x2,y2; while(scanf("%d",&m)==1){ memset(bit,0,sizeof bit); memset(flag,0,sizeof flag); while(m--){ scanf("%s",op); if(op[0]=='B'){ scanf("%d%d",&x1,&y1); x1++,y1++; if(flag[x1][y1]) continue; add(x1,y1,1); flag[x1][y1]=1; } else if(op[0]=='D'){ scanf("%d%d",&x1,&y1); x1++,y1++; if(flag[x1][y1]==0) continue; add(x1,y1,-1); flag[x1][y1]=0; } else { scanf("%d%d%d%d",&x1,&x2,&y1,&y2); x1++,y1++,x2++,y2++; if(x1>x2) swap(x1,x2); if(y1>y2) swap(y1,y2); printf("%d ",query(x2,y2)-query(x1-1,y2)-query(x2,y1-1)+query(x1-1,y1-1)); } } } return 0; }