题意:
给你一个n*n的矩阵(由0或1组成),有两种操作,C x1,y1,x2,y2将两个点组成的矩阵取反。Q x,y,求x,y这一点的值。。。
对于求一点的值,只需要求跟这一点有关的之后的位置翻转多少次就可以。。。
#include"stdio.h"
#include"string.h"
#define N 1005
int C[N][N];
int n;
int bit(int x)
{
return x&(-x);
}
int sum(int x,int y)
{
int ans=0;
for(int i=x;i>0;i-=bit(i))
{
for(int j=y;j>0;j-=bit(j))
ans+=C[i][j];
}
return ans;
}
void update(int x,int y,int a)
{
for(int i=x;i<=n;i+=bit(i))
{
for(int j=y;j<=n;j+=bit(j))
C[i][j]=C[i][j]+a;
}
}
int main()
{
int T;
int m;
int i;
char s;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
memset(C,0,sizeof(C));
for(i=0;i<m;i++)
{
getchar();
scanf("%c",&s);
if(s=='C')
{
int x1,x2,y1,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
x2++;y2++;
update(x2,y2,1);
update(x1,y1,1);
update(x2,y1,-1);
update(x1,y2,-1);
}
else
{
int x,y;
scanf("%d%d",&x,&y);
printf("%d\n",1&sum(x,y));
}
}
printf("\n");
}
return 0;
}