http://acm.hdu.edu.cn/showproblem.php?pid=2642
裸二维树状数组,没有秒杀,坑点是这题的询问是x1,x2,y1,y2(其实题目说得清清楚楚,惯性思维害死人?写完不过sample无力吐槽)。
然后犯了一个巨2的笔误,死活没查出来,还是让路人王同学看出来的、、、、跪了
View Code
#include <iostream> using namespace std; const int MAX=1010; int vis[MAX][MAX],tree[MAX][MAX]; int lowbit(int i) { return i&(-i); } void update(int x,int y,int val) { for(int i=x;i<MAX;i+=lowbit(i)) for(int j=y;j<MAX;j+=lowbit(j)) tree[i][j]+=val; } int Sum(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+=tree[i][j]; return sum; } int main() { int M; scanf("%d",&M); while(M--) { char op[2]; scanf("%s",op); int x1,y1,x2,y2; switch(op[0]) { case 'B': { scanf("%d%d",&x1,&y1); x1++;y1++; if(!vis[x1][y1]) { update(x1,y1,1); vis[x1][y1]=1; } break; } case 'D': { scanf("%d%d",&x1,&y1); x1++;y1++; if(vis[x1][y1]) { update(x1,y1,-1); vis[x1][y1]=0; } break; } case 'Q': { int minx,miny,maxx,maxy; scanf("%d%d%d%d",&x1,&x2,&y1,&y2); x1++;y1++;x2++;y2++; minx=min(x1,x2); miny=min(y1,y2); maxx=max(x1,x2); maxy=max(y1,y2); printf("%d\n",Sum(maxx,maxy)+Sum(minx-1,miny-1)-Sum(minx-1,maxy)-Sum(maxx,miny-1)); break; } } } return 0; }