//二维数状数组模板题,不解释
AC代码:
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define N 1005 int a[N][N]; int vis[N][N]; char s[5]; int lower_bit(int i) { return i&(-i); } void add(int x,int y,int v) { for(int i=x;i<=N;i+=lower_bit(i)) { for(int j=y;j<=N;j+=lower_bit(j)) { a[i][j]+=v; } } } int sum(int x,int y) { int s=0; for(int i=x;i>0;i-=lower_bit(i)) { for(int j=y;j>0;j-=lower_bit(j)) { s+=a[i][j]; } } return s; } int main() { int t; scanf("%d",&t); int i; int x,y; int x1,y1,x2,y2; memset(a,0,sizeof(a)); memset(vis,0,sizeof(vis)); for(i=0;i<t;i++) { scanf("%s",s); if(s[0]=='B') { scanf("%d%d",&x,&y); x++,y++; if(!vis[x][y]) { vis[x][y]=1; add(x,y,1); } } if(s[0]=='Q') { 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\n",sum(x2,y2)+sum(x1-1,y1-1)-sum(x1-1,y2)-sum(x2,y1-1)); } if(s[0]=='D') { scanf("%d%d",&x,&y); x++,y++; if(vis[x][y]) { add(x,y,-1); vis[x][y]=0; } } } return 0; }