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;
}
浙公网安备 33010602011771号