poj 2155

题意:一个n*n的01矩阵,和几种动态操作,包括对子矩阵(x,y,xx,yy)的所有元素异或,查询某一点(x,y)的元素值。

参见国家队 09年 武森《浅谈信息学竞赛中的“0”和“1”》

代码:

#include<iostream>
#include<fstream>

using namespace std;

int b[1005][1005];

int lowbit(int x){
	return x&(-x);
}
int n;

void add(int x,int y){
	int i=y;
	while(x<=n)
	{
		y=i;
		while(y<=n)
		{
			b[x][y]++;
			y+=lowbit(y);
		}
		x+=lowbit(x);
	}
}

int getsum(int x,int y){
	int i=y;
	int j=0;
	while(x>0)
	{
		y=i;
		while(y>0)
		{
			j+=b[x][y];
			y-=lowbit(y);
		}
		x-=lowbit(x);
	}
	return j;
}
void read(){
//	ifstream cin("in.txt");
	int i,j,k,s,t,p;
	int cas;
	int m;
	cin>>cas;
	while(cas--)
	{
		cin>>n>>m;
		n++;
		memset(b,0,sizeof(b));
		for(i=1;i<=m;i++)
		{
			char c;
			cin>>c;
			if(c=='C')
			{
				cin>>j>>k>>s>>t;
				add(j,k);
				add(j,t+1);
				add(s+1,k);
				add(s+1,t+1);
			}
			else
			{
				cin>>s>>t;
				s=getsum(s,t);
				cout<<s%2<<endl;
			}
		}
		cout<<endl;
	}
}

int main(){
	read();
	return 0;
}

posted on 2011-05-14 16:53  宇宙吾心  阅读(726)  评论(0)    收藏  举报

导航