poj-2155(二维树状数组)
http://acm.hust.edu.cn:8080/judge/problem/viewProblem.action?id=10491
题意:给出一组数据,初始值全部为0,再给出两个坐标,对在这范围之类的数据取反(1变为0,0变为1),在讯问一个点,输出那个点的值。
思路:二维树状数组,区间更新,单点求值,先将取反次数相加,在对2取余。
#include<iostream>
using namespace std;
#define max 1010
int c[max][max];
int lowbit(int x)
{
return x&(-x);
}
int getsum(int x,int y)
{
int i,j;
int sum=0;
for(i=x;i>0;i-=lowbit(i))
{
for(j=y;j>0;j-=lowbit(j))
{
sum+=c[i][j];
}
}
return sum;
}
void updata(int x,int y,int data)
{
int i,j;
for(i=x;i<max;i+=lowbit(i))
{
for(j=y;j<max;j+=lowbit(j))
{
c[i][j]+=data;
}
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,m;
scanf("%d%d",&n,&m);
memset(c,0,sizeof(c));
for(int i=0;i<m;i++)
{
int x1,y1,x2,y2;
char s[5];
scanf("%s",s);
if(s[0]=='C')
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
x2++;
y2++; //因为x2这个点也要更新
updata(x1,y1,1);
updata(x1,y2,-1);
updata(x2,y1,-1);
updata(x2,y2,1);
}
else
{
int x3,y3;
scanf("%d%d",&x3,&y3);
int sum;
sum=getsum(x3,y3);
sum%=2;
printf("%d\n",sum);
}
}
if(t!=0)
printf("\n");
}
}
朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。

浙公网安备 33010602011771号