这题和前面的1195有点类似,也就让我发现了二维树状数组的题好像都有这种特点,就是矩阵的重叠需要加减来实现抵消。极力推荐这篇文章:http://download.youkuaiyun.com/detail/lenleaves/4548401点击打开链接
<span style="font-size:24px;">#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1010;
int x,n,t,x1,x2,y1,y2;
int a[maxn][maxn];
char c[5];
int cc[maxn];
int lowbit(int x)
{
return x&(-x);
}
int add(int x1,int y1)
{
for(int i=x1;i<=n;i+=lowbit(i))
{
for(int j=y1;j<=n;j+=lowbit(j))
{
a[i][j]++;
}
}
return 0;
}
int sum(int x,int y)
{
int ans=0;
for(int i=x;i>0;i-=lowbit(i))
{
for(int j=y;j>0;j-=lowbit(j))
{
ans+=a[i][j];
}
}
return ans;
}
int main()
{
scanf("%d",&x);
while(x--)
{
scanf("%d%d",&n,&t);
memset(a,0,sizeof(a));
while(t--)
{
scanf("%s",c);
if(c[0]=='C')
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
add(x1,y1);
add(x1,y2+1);
add(x2+1,y1);
add(x2+1,y2+1);
}
if(c[0]=='Q')
{
scanf("%d%d",&x1,&y1);
int ss=sum(x1,y1);
if(ss%2!=0)
{
printf("1\n");
}
else
printf("0\n");
}
}
if(x!=0)
printf("\n");
}
return 0;
}
</span>