您的位置:首页 > 其它

POJ 2155 Matrix (二维树状数组+经典题)

2014-04-03 12:43 267 查看
好开森啊,一次就AC了

//500ms
#include<iostream>
#include<cstdio>
#include<cstring>
#define low(x) x&(-x);
using namespace std;
int c[1001][1001],n;
void update(int x,int y,int val)
{
while(x<=n)
{
int y1=y;
while(y1<=n)
{
c[x][y1]+=val;
y1+=low(y1);
}
x+=low(x);
}
}

int getsum(int x,int y)
{
int sum=0;
while(x>0)
{
int y1=y;
while(y1>0)
{
sum+=c[x][y1];
y1-=low(y1);
}
x-=low(x);
}
return sum;
}
int main()
{
int t,m;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
memset(c,0,sizeof(c));

while(m--)
{
char p;
cin>>p;
if(p=='C')
{
int x1,y1,x2,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
if(x1>x2)x1^=x2^=x1^=x2;
if(y1>y2)y1^=y2^=y1^=y2;
update(x1,y1,1);
update(x1,y2+1,-1);
update(x2+1,y1,-1);
update(x2+1,y2+1,1);
}
else{
int x,y;
scanf("%d%d",&x,&y);
printf("%d\n",getsum(x,y)%2);
}
getchar();

}
if(t>0)printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: