hdoj 2642
解决:二维树状数组简单
最后的时候,必须判断下x与a,y与b的关系,若x>a或者y>b将无法处理
#include <iostream> #include <algorithm> using namespace std; const int N=1001; //一个是树状数组,一个是状态标记 int c[N+5][N+5]; bool s[N+5][N+5]; int m; inline int lowbit(int x) { return x&(-x); } inline void update(int x,int y,int inc) { for(int i=x;i<=N;i+=lowbit(i)) for(int j=y;j<=N;j+=lowbit(j)) c[i][j]+=inc; } inline int getsum(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 main() { scanf("%d",&m); char cmd; int x,y,a,b; while(m--) { getchar(); scanf("%c",&cmd); if(cmd=='B') { scanf("%d%d",&x,&y); if(s[x+1][y+1]==0) { s[x+1][y+1]=1; update(x+1,y+1,1); } } else if(cmd=='D') { scanf("%d%d",&x,&y); if(s[x+1][y+1]==1) { s[x+1][y+1]=0; update(x+1,y+1,-1); } } else { scanf("%d%d%d%d",&x,&a,&y,&b); if(x>a)swap(x,a); if(y>b)swap(y,b); printf("%d\n",getsum(a+1,b+1)-getsum(a+1,y)-getsum(x,b+1)+getsum(x,y)); } } system("pause"); return 0; }