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;

}

  

你可能感兴趣的:(树状数组)