poj 2155(树状数组)

点击打开链接


题意:

给你一个n*n的矩阵(由0或1组成),有两种操作,C x1,y1,x2,y2将两个点组成的矩阵取反。Q x,y,求x,y这一点的值。。。


对于求一点的值,只需要求跟这一点有关的之后的位置翻转多少次就可以。。。

#include"stdio.h"
#include"string.h"
#define N 1005
int C[N][N];
int n;
int bit(int x)
{
	return x&(-x);
}
int sum(int x,int y)
{
	int ans=0;
	for(int i=x;i>0;i-=bit(i))
	{
		for(int j=y;j>0;j-=bit(j))
			ans+=C[i][j];
	}
	return ans;
}
void update(int x,int y,int a)
{
	for(int i=x;i<=n;i+=bit(i))
	{
		for(int j=y;j<=n;j+=bit(j))
			C[i][j]=C[i][j]+a;
	}
}
int main()
{
	int T;
	int m;
	int i;
	char s;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d%d",&n,&m);
		memset(C,0,sizeof(C));		
		for(i=0;i<m;i++)
		{
			getchar();
			scanf("%c",&s);
			if(s=='C')
			{
				int x1,x2,y1,y2;
				scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
				x2++;y2++;
				update(x2,y2,1);
				update(x1,y1,1);
				update(x2,y1,-1);
				update(x1,y2,-1);
			}
			else
			{
				int x,y;
				scanf("%d%d",&x,&y);
				printf("%d\n",1&sum(x,y));
			}
		}
		printf("\n");
	}
	return 0;
}



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