题目链接http://poj.org/problem?id=2155
题意 :这是我第一次做二维的树状数组,说实话我刚开始没看懂题的意思,然后再网上搜了一下博客,还是没懂,后来让同学给我讲了一下,我理解了,意思就是,给你一个矩阵,这个矩阵的初始值都为0 ,然后让你从左上角(x1,y2)到右下角(x2,y2)改变这个矩阵,值为1 的改为0,为0的话改为1, 然后再给出(x1,y1),查找a[x1,y1]的值。
思路: 这个链接讲的比较清楚 http://download.csdn.net/detail/lenleaves/4548401
代码是我按模板打下来的
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
int X,n,t;
char s[12];
int c[1005][1005];
int lowbit(int x)
{
return x&(-x);
}
void add(int x,int y,int num)
{
int temp=y;
while(x<=n)
{
y=temp;
while(y<=n)
{
c[x][y]+=num;
y+=lowbit(y);
}
x+=lowbit(x);
}
}
int sum(int x,int y)
{
int cnt=0;
int temp=y;
while(x>0)
{
y=temp;
while(y>0)
{
cnt+=c[x][y];
y-=lowbit(y);
}
x-=lowbit(x);
}
return cnt;
}
int main()
{
int x1,y1,x2,y2;
scanf("%d",&X);
while(X--)
{
memset(c,0,sizeof(c));
scanf("%d%d",&n,&t);
while(t--)
{
scanf("%s",s);
if(s[0]=='C')
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
add(x1,y1,1);
add(x2+1,y1,1);
add(x1,y2+1,1);
add(x2+1,y2+1,1);
}
if(s[0]=='Q')
{
scanf("%d%d",&x1,&y1);
if(sum(x1,y1)%2==0)
printf("0\n");
else
printf("1\n");
}
}
printf("\n");
}
return 0;
}