思路:纯粹的二维树状数组模板题。。
Code :
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
const int MAX_N=1005;
const int MAX_M=1005;
int Q;
int C[MAX_N][MAX_M];
bool boo[MAX_N][MAX_M];
int Lowbit(int x);
void Update(int x,int y,int p);
int Query(int x,int y);
int main()
{
ios::sync_with_stdio(false);
char c;
int x1,y1,x2,y2;
cin>>Q;
while(Q--){
cin>>c;
if(c=='Q'){
cin>>x1>>x2>>y1>>y2;
if(x1>x2) swap(x1,x2);
if(y1>y2) swap(y1,y2);
++x2; ++y2;
int ans=Query(x2,y2)-Query(x1,y2)-Query(x2,y1)+Query(x1,y1);
cout<<ans<<endl;
}else{
cin>>x1>>y1;
++x1; ++y1;
if(c=='B'&&boo[x1][y1]==false){
boo[x1][y1]=true;
Update(x1,y1,1);
}else if(c=='D'&&boo[x1][y1]==true){
boo[x1][y1]=false;
Update(x1,y1,-1);
}
}
}
return 0;
}
int Lowbit(int x)
{
return x&(-x);
}
void Update(int x,int y,int p)
{
for(int i=x;i<MAX_N;i+=Lowbit(i))
for(int j=y;j<MAX_M;j+=Lowbit(j))
C[i][j]+=p;
}
int Query(int x,int y)
{
int ans=0;
for(int i=x;i>0;i-=Lowbit(i))
for(int j=y;j>0;j-=Lowbit(j))
ans+=C[i][j];
return ans;
}