- 题目大意
有两种操作,C是每次操作可以是编辑某个矩形区域,这个区域的0改为1,1改为0,Q是每次查询只查询某一个点的值是0还是1。
- 解题思路
可以利用树状数组来做,一维和二维都可以,我用的是二维,主要二维写起来方便。关于如何查询点的信息,画个图就可以很好理解了(查询单点类似于求和,就跟气球涂色一样)。
- 代码
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstring>
#include<stack>
using namespace std;
int n;
const int N=1e3+1;
int num[N][N];
char str[10];
int lowbit(int x)
{
return x&(-x);
}
int sum(int x,int y)
{
int re=0;
for(int i=x;i>=1;i-=lowbit(i))
{
for(int j=y;j>=1;j-=lowbit(j))
{
re+=num[i][j];
}
}
return re;
}
void add(int x,int y,int z)
{
for(int i=x;i<=n;i+=lowbit(i))
{
for(int j=y;j<=n;j+=lowbit(j))
{
num[i][j]+=z;
}
}
}
int main()
{
int t,m,a,b,c,d;
scanf("%d",&t);
while(t--)
{
memset(num,0,sizeof(num));
scanf("%d%d",&n,&m);
while(m--)
{
scanf("%s",str);
if(str[0]=='C')
{
scanf("%d%d%d%d",&a,&b,&c,&d);
add(a,b,1);
add(c+1,b,1);
add(a,d+1,1);
add(c+1,d+1,1);
}
else if(str[0]=='Q')
{
scanf("%d%d",&a,&b);
printf("%d\n",sum(a,b)%2);
}
}
printf("\n");
}
return 0;
}