Stars
Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/65536 K (Java/Others)Total Submission(s): 1808 Accepted Submission(s): 769
To make the problem easier,we considerate the sky is a two-dimension plane.Sometimes the star will be bright and sometimes the star will be dim.At first,there is no bright star in the sky,then some information will be given as "B x y" where 'B' represent bright and x represent the X coordinate and y represent the Y coordinate means the star at (x,y) is bright,And the 'D' in "D x y" mean the star at(x,y) is dim.When get a query as "Q X1 X2 Y1 Y2",you should tell Yifenfei how many bright stars there are in the region correspond X1,X2,Y1,Y2.
There is only one case.
each line start with a operational character.
if the character is B or D,then two integer X,Y (0 <=X,Y<= 1000)followed.
if the character is Q then four integer X1,X2,Y1,Y2(0 <=X1,X2,Y1,Y2<= 1000) followed.
5 B 581 145 B 581 145 Q 0 600 0 200 D 581 145 Q 0 600 0 200
10
题意分析:二维树状数组
AC代码:
#include<iostream> #include<algorithm> #include<cstdio> #include<stdio.h> #include<cstring> #include<string.h> using namespace std; bool vis[1002][1002]; int c[1002][1002]; inline int lowbit(const int &t) { return t&(-t); } void add(const int &x,const int &y,const int &num) { int i,j; for(i=x;i<=1001;i+=lowbit(i)) for(j=y;j<=1001;j+=lowbit(j)) c[i][j]+=num; } int getsum(const int &x,const int &y) { int sum=0,i,j; for(i=x;i>0;i-=lowbit(i)) for(j=y;j>0;j-=lowbit(j)) sum+=c[i][j]; return sum; } int main() { char str[3]; int cas,x1,y1,x2,y2,xmin,xmax,ymin,ymax; scanf("%d",&cas); while(cas--) { scanf("%s",str); if(str[0]=='Q') { scanf("%d%d%d%d",&x1,&x2,&y1,&y2); x1++;y1++;x2++;y2++; xmin=min(x1,x2); xmax=max(x1,x2); ymin=min(y1,y2); ymax=max(y1,y2); printf("%d\n",getsum(xmax,ymax)-getsum(xmin-1,ymax)-getsum(xmax,ymin-1)+getsum(xmin-1,ymin-1)); } else { scanf("%d%d",&x1,&y1); x1++;y1++; if(str[0]=='B') { if(vis[x1][y1]==false) { vis[x1][y1]=true; add(x1,y1,1); } } else { if(vis[x1][y1]) { vis[x1][y1]=false; add(x1,y1,-1); } } } } return 0; }