题目信息:count black
利用二维树状数组:
//利用二维树状数组
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
int c[101][101];
int b[101][101];
int Row,Col;
//下面三个函数是基本套路
inline int Lowbit(const int &x)
{
return x&(-x);
}
int Sum(int i,int j)
{//计算(1,1)--(i,j)之间的和
int tempj,sum=0;
while(i > 0)
{
tempj=j;
while(tempj > 0){
sum+=c[i][tempj];
tempj-=Lowbit(tempj);
}
i-=Lowbit(i);
}
return sum;
}
void Update(int i,int j,int num)
{//更新(i,j) 为c[i][j]+num
int tempj;
while(i<=Row)
{
tempj=j;
while(tempj<=Col){
c[i][tempj]+=num;
tempj+=Lowbit(tempj);
}
i+=Lowbit(i);
}
}
void whiteUpdate(int x,int y,int L)
{
for(int i=x;i<x+L;++i)
for(int j=y;j<y+L;++j)
{
if(b[i][j]==1) {b[i][j]=0;Update(i,j,-1);}
else continue;
}
}
void blackUpdate(int x,int y,int L)
{
for(int i=x;i<x+L;++i)
for(int j=y;j<y+L;++j)
{
if(b[i][j]==1) continue;
else {b[i][j]=1;Update(i,j,1);};
}
}
int blackSum(int x,int y,int L)
{//计算(x,y)--(x+L-1,Y+L-1)之间的数
return Sum(x+L-1,y+L-1)+Sum(x-1,y-1)-Sum(x-1,y+L-1)-Sum(x+L-1,y-1);
}
int main()
{
int x,y,L,N;
string str;
Row=Col=100;
memset(c,0,sizeof(c));
memset(b,0,sizeof(b));
cin>>N;
while(N--)
{
cin>>str>>x>>y>>L;
switch(str[0])
{
case 'W':
whiteUpdate(x,y,L);
break;
case 'B':
blackUpdate(x,y,L);
break;
case 'T':
cout<<blackSum(x,y,L)<<endl;
break;
default: break;
}
}
return 0;
}