题意:给定一个0,1矩阵,首先矩阵都是0,然后给出一个小矩阵,将这个小矩阵所有元素进行异或操作,最后查询某个元素的值
题解:使用二维树状数组,二位树状数组的讲解传送门
然后参考这篇论文传送门
附上代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=1e3+50;
int bit[maxn][maxn];
int t,n,m;
char s[10];
int lowbit(int i)
{
return i&(-i);
}
void add(int a,int b)
{
for(int i=a;i<=n;i+=lowbit(i)){
for(int j=b;j<=n;j+=lowbit(j)){
bit[i][j]++;
}
}
}
int sum(int a,int b)
{
int s=0;
for(int i=a;i>0;i-=lowbit(i)){
for(int j=b;j>0;j-=lowbit(j)){
s+=bit[i][j];
}
}
return s;
}
int main()
{
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
memset(bit,0,sizeof(bit));
while(m--){
scanf("%s",s);
if(s[0]=='C'){
int x1,y1,x2,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
add(x2+1,y2+1);
add(x1,y1);
add(x1,y2+1);
add(x2+1,y1);
}else{
int x,y;
scanf("%d%d",&x,&y);
printf("%d\n",sum(x,y)%2);
}
}
if(t){
printf("\n");
}
}
return 0;
}