话说这道题是一道不折不扣的二维树状数组的水题,可是对于我这种菜鸟中的vip来说,却还是纠结了很久很久。。留下做个模板吧。。。。。
题目:
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.
#include <iostream>
#include <string.h>
#include <string>
#include <cmath>
#include <cstdio>
int aa[1005][1005];
bool visit[1005][1005];
using namespace std;
#define min(a,b)(a)<(b)?(a):(b);
#define max(a,b)(a)>(b)?(a):(b);
int lowbit(int x){
return x&(-x);
}
void update(int x,int y,int num){
int t=y;
while(x<=1003){
y=t;
while(y<=1003){
aa[x][y]+=num;
y+=lowbit(y);
}
x+=lowbit(x);
}
}
int find(int x,int y){
int s=0,t=y;
while(x>0){
y=t;
while(y>0){
s+=aa[x][y];
y-=lowbit(y);
}
x-=lowbit(x);
}
return s;
}
int main(){
memset(aa,0,sizeof(aa));
memset(visit,0,sizeof(visit));
int n;
scanf("%d",&n);
getchar();
char chh;
int x1,y1,x2,y2;
while(n--){
scanf("%c",&chh);
if(chh=='B')
{
scanf("%d%d",&x1,&y1);
if(visit[x1+1][y1+1]==0)
{visit[x1+1][y1+1]=1;update(x1+1,y1+1,1);}
}
if(chh=='Q'){
scanf("%d%d%d%d",&x1,&x2,&y1,&y2);
int maxx,maxy,minx,miny;
maxx=max(x1,x2);
minx=min(x1,x2);
maxy=max(y1,y2);
miny=min(y1,y2);
int a=find(maxx+1,maxy+1);
int b=find(minx,miny);
int c=find(maxx+1,miny);
int d=find(minx,maxy+1);
printf("%d\n",a+b-c-d);
}
if(chh=='D'){
scanf("%d%d",&x1,&y1);
if(visit[x1+1][y1+1]==1)
{visit[x1+1][y1+1]=0;update(x1+1,y1+1,-1);}
}
if(n>=1)
getchar();
}
return 0;
}