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");
	}
}

 

 

posted @ 2012-12-20 21:14  紫忆  阅读(334)  评论(0编辑  收藏  举报