题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2642
题目大意:一开始全部的星星是暗着的.
Bxy:表示(x,y)的星星亮;
Dxy:表示(x,y)的星星暗;
Qx1x2y1y2:表示求出(x1,y1)--->(x2,y2)的亮着的星星的数量.
思路:很明显的二维树状数组.
代码:
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <ctype.h>
#include <math.h>
#include <time.h>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
#define ull unsigned __int64
#define ll __int64
//#define ull unsigned long long
//#define ll long long
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define middle (l+r)>>1
#define MOD 9901
#define esp (1e-10)
const int INF=0x3F3F3F3F;
//const double pi=acos(-1.0);
const int N=1010;
int n,m;
int sum[N][N],vis[N][N];
int lowbit(int x){return x&(-x);}
void Add(int x,int y,int c){
int t=y;
while(x<N){
while(y<N) sum[x][y]+=c,y+=lowbit(y);
x+=lowbit(x);
y=t;
}
}
int Sum(int x,int y){
int r=0,t=y;
while(x>0){
while(y>0) r+=sum[x][y],y-=lowbit(y);
x-=lowbit(x);
y=t;
}
return r;
}
void swap(int& x,int& y){int t=x;x=y;y=t;}
int main(){
//freopen("1.in","r",stdin);
//freopen("1.out","w",stdout);
int i,j,k,x1,x2,y1,y2;
char op[2];
//int T,cas;scanf("%d",&T);for(cas=1;cas<=T;cas++)
while(~scanf("%d",&n)){
memset(sum,0,sizeof(sum));
memset(vis,0,sizeof(vis));
while(n--){
scanf("%s",op);
if(op[0]=='Q'){
scanf("%d%d%d%d",&x1,&x2,&y1,&y2);
if(x1>x2) swap(x1,x2);
if(y1>y2) swap(y1,y2);
printf("%d\n",Sum(x2+2,y2+2)+Sum(x1+1,y1+1)-Sum(x1+1,y2+2)-Sum(x2+2,y1+1));
}else{
scanf("%d%d",&x1,&y1);
if(op[0]=='B'){
if(!vis[x1][y1]) Add(x1+2,y1+2,1),vis[x1][y1]=1;
}else{
if(vis[x1][y1]) Add(x1+2,y1+2,-1),vis[x1][y1]=0;
}
}
}
}
return 0;
}