二维树状数组。
由于是翻转的操作,而且是区间操作,所以以往的update和query的操作是翻过来的。
update(x1-1,y1-1),update(x2,y2),update(x1-1,y2),update(x2,y1-1).
画出矩形区域来模拟一下很好理解。
由于只是记录是0还是1,所以在getSum中只需要模2即可。
可以用二维线段树写,代码多了很多。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=1005;
int a[maxn][maxn];
int n,m;
int Lowbit(int x)
{
return x&(-x);
}
void update(int x,int y)
{
int i,j;
for(i=x;i>0;i-=Lowbit(i)){
for(j=y;j>0;j-=Lowbit(j)){
a[i][j]^=1;
}
}
}
int getSum(int x,int y)
{
int i,j,ans=0;
for(i=x;i<=n;i+=Lowbit(i)){
for(j=y;j<=n;j+=Lowbit(j)){
ans+=a[i][j];
}
}
return ans%2;
}
int main()
{
int T,x1,y1,x2,y2;
char op[10];
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
memset(a,0,sizeof(a));
while(m--){
scanf("%s %d %d",op,&x1,&y1);
if(op[0]=='C'){
scanf("%d%d",&x2,&y2);
update(x1-1,y1-1);
update(x2,y2);
update(x2,y1-1);
update(x1-1,y2);
}
else{
printf("%d\n",getSum(x1,y1));
}
}
printf("\n");
}
return 0;
}