解题思路:
这里简单粗暴的用了懒人标记的二维线段树,实际上可以利用01异或的性质可以不用去更新儿子,直接把有包含(x,y)点的矩阵都异或起来就行了。
#include<cstdio>
#include<iostream>
#include<cstring>
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
using namespace std;
typedef long long ll;
const int mx = 1e3 + 5;
int sum[mx*3][mx*3],m,n;
int L1,R2,L2,R1,u,flag,val[mx][mx];
void update_y(int l,int r,int rt,int d)
{
if(L2<=l&&r<=R2){
sum[d][rt]++;
return ;
}
int mid = (l+r)>>1;
if(L2<=mid) update_y(lson,d);
if(R2>mid) update_y(rson,d);
}
void update_x(int l,int r,int rt)
{
if(L1<=l&&r<=R1){
update_y(1,n,1,rt);
return ;
}
int mid = (l+r)>>1;
if(L1<=mid) update_x(lson);
if(R1>mid) update_x(rson);
}
void query_y(int l,int r,int rt,int d)
{
if(l==r){
if(flag) sum[d<<1][rt] += sum[d][rt],sum[d<<1|1][rt] += sum[d][rt];
if(!flag) val[L1][R1] = (sum[d][rt]&1)^val[L1][R1];
sum[d][rt] = 0;
return ;
}
sum[d][rt<<1] += sum[d][rt],sum[d][rt<<1|1] += sum[d][rt];
sum[d][rt] = 0;
int mid = (l+r)>>1;
if(R1<=mid) query_y(lson,d);
else query_y(rson,d);
}
void query_x(int l,int r,int rt)
{
if(l==r) flag = 0;
query_y(1,n,1,rt);
if(l==r) return ;
int mid = (l+r)>>1;
if(L1<=mid) query_x(lson);
else query_x(rson);
}
int main()
{
int t;
char c[100];
scanf("%d",&t);
while(t--){
memset(val,0,sizeof(val));
memset(sum,0,sizeof(sum));
scanf("%d%d",&n,&m);
while(m--){
scanf("%s",c);
if(c[0]=='C'){
scanf("%d%d%d%d",&L1,&L2,&R1,&R2);
update_x(1,n,1);
}
else{
flag = 1;
scanf("%d%d",&L1,&R1);
query_x(1,n,1);
printf("%d\n",val[L1][R1]);
}
}
puts("");
}
return 0;
}