poj-2155(二维树状数组)

http://acm.hust.edu.cn:8080/judge/problem/viewProblem.action?id=10491

题意:给出一组数据,初始值全部为0,再给出两个坐标,对在这范围之类的数据取反(1变为0,0变为1),在讯问一个点,输出那个点的值。

思路:二维树状数组,区间更新,单点求值,先将取反次数相加,在对2取余。

#include<iostream>

using namespace std;

#define max 1010

int c[max][max];

int lowbit(int x)

{

	return x&(-x);

}

int getsum(int x,int y)

{

	int i,j;

	int sum=0;

	for(i=x;i>0;i-=lowbit(i))

	{

		for(j=y;j>0;j-=lowbit(j))

		{

			sum+=c[i][j];

		}

	}

	return sum;

}

void updata(int x,int y,int data)

{

	int i,j;

	for(i=x;i<max;i+=lowbit(i))

	{

		for(j=y;j<max;j+=lowbit(j))

		{

			c[i][j]+=data;

		}

	}

}

int main()

{

	int t;

	scanf("%d",&t);

	while(t--)

	{

		int n,m;

		scanf("%d%d",&n,&m);

		memset(c,0,sizeof(c));

		for(int i=0;i<m;i++)

		{

			int x1,y1,x2,y2;

			char s[5];

			scanf("%s",s);

			if(s[0]=='C')

			{

				scanf("%d%d%d%d",&x1,&y1,&x2,&y2);

				x2++;

				y2++;                           //因为x2这个点也要更新

				updata(x1,y1,1);                        

				updata(x1,y2,-1);              

				updata(x2,y1,-1);              

				updata(x2,y2,1);

			}

			else

			{

				int x3,y3;

				scanf("%d%d",&x3,&y3);

				int sum;

				sum=getsum(x3,y3);

				sum%=2;

				printf("%d\n",sum);

			}

		}

		if(t!=0)

		printf("\n");

	}

}

 

 

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