poj 1656(二维树状数组解法)
题目信息: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; }