题目链接:http://poj.org/problem?id=2155
题目大意:给你一个矩阵,每次对x1,y1,x2,y2对角线组成的矩形区域内0变为1,1变为0,最后询问某个点的值。
解题思路:一维树状数组的其中一个功能就是 插线问点,只是这个变为了二维的,这道题的插线和前面几篇的求和道理是一样的,先加上去,最后在减下来,相当于没操作。
代码如下:
Problem: 2155
Memory: 4344K Time: 485MS
Language:G++
Result:Accepted
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define N 1005
int s[N][N];
int lowbit(int x)
{
return x&(-x);
}
void insert(int x,int y)
{
for(int i=x; i>0; i-=lowbit(i))
for(int j=y; j>0; j-=lowbit(j))
s[i][j]^=1;
}
int get_sum(int x,int y)
{
int sum=0;
for(int i=x; i<N; i+=lowbit(i))
for(int j=y; j<N; j+=lowbit(j))
sum+=s[i][j];
return sum&1;
}
int main()
{
int T,x,y,a1,b1,a2,b2;
char c[2];
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&x,&y);
memset(s,0,sizeof(s));
while(y--)
{
scanf("%s",c);
if(c[0]=='C')
{
scanf("%d%d%d%d",&a1,&b1,&a2,&b2);
if(a1>a2) swap(a1,a2);
if(b1>b2) swap(b1,b2);
insert(a1-1,b1-1);
insert(a2,b2);
insert(a1-1,b2);
insert(a2,b1-1);
}
else
{
scanf("%d%d",&a1,&b1);
printf("%d\n",get_sum(a1,b1));
}
}
printf("\n");
}
}