题目大意:Yifenfei是一个浪漫的人,他喜欢数天上的星星。为了使问题变得更容易,我们假设天空是一个二维平面,上面的星星有时会亮,有时会发暗。最开始,没有明亮的星星在天空中,然后将给出一些信息,“B XY”,其中“B”代表明亮,x代表X坐标和Y代表Y坐标是指在(X,Y)的明星是光明的,而在“D XY”'D'的意思是灰暗的星星在(X , Y).当得到“Q X1 X2 Y1 Y2”的查询,你应该告诉Yifenfei在该地区有多少明亮的星星在X1,X2,Y1,Y2决定的矩形里。
-
B x y:点(x,y)处的星星变亮
-
D x y:点(x,y)处的星星变暗
-
Q x1 x2 y1 y2:查询左下角(x1,y1)和右上角(x2,y2)的矩形
#include <iostream>
#include <cstdio>
using namespace std;
const int Max = 1010;
int c[Max][Max];
int vis[Max][Max];
int lowbit(int x)
{
return x&(-x);
}
void update(int x,int y,int val)
{
int t;
while(x<=Max){
t = y;
while(t<=Max){
c[x][t]+=val;
t+=lowbit(t);
}
x+=lowbit(x);
}
}
int sum(int x,int y)
{
int res=0;
while(x>0){
int t = y;
while(t>0){
res+=c[x][t];
t-=lowbit(t);
}
x-=lowbit(x);
}
return res;
}
int main()
{
int M,x,y;
string str;
scanf("%d",&M);
while(M--)
{
cin>>str;
if(str[0]=='B'){
scanf("%d%d",&x,&y);
x++,y++;
if(!vis[x][y]){
vis[x][y] = 1;
update(x,y,1);
}
}else if(str[0]=='Q'){
int x1,y1,x2,y2;
scanf("%d%d%d%d",&x1,&x2,&y1,&y2);
x1++,x2++,y1++,y2++;
int X,Y;
X = max(x1,x2);
x = min(x1,x2);
Y = max(y1,y2);
y = min(y1,y2);
int ans = sum(X,Y)+sum(x-1,y-1)-sum(X,y-1)-sum(x-1,Y);
printf("%d
",ans);
}else{//D
scanf("%d%d",&x,&y);
x++,y++;
if(vis[x][y]){
vis[x][y]=0;
update(x,y,-1);
}
}
}
return 0;
}