还是二维的树状数组,我写了一个,不知道为神马就过不去,很无语。看了别人的代码,发现可以对每个格子计数,计数之后,直接模2就是结果。我真是TT,怎么就没想到呢?!!但是我直接写一个更新而言不知道怎么错了。代码都贴一下吧。以便回国头来好好思考。
AC代码:
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
#define N 1005
int c[N][N];
int n;
int lowbit(int x)
{
return x&(-x);
}
void Updata(int x,int y)
{
for(int i=x;i<=n;i+=lowbit(i))
{
for(int j=y;j<=n;j+=lowbit(j))
{
c[i][j]++;
}
}
}
int Getsum(int x,int y)
{
int sum=0;
for(int i=x;i>0;i-=lowbit(i))
{
for(int j=y;j>0;j-=lowbit(j))
{
sum+=c[i][j];
}
}
return sum;
}
int main()
{
int t,oper;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&oper);
memset(c,0,sizeof(c));
int i,j,x1,y1,x2,y2;
char s[3];
while(oper--)
{
scanf("%s",s);
if(s[0]=='C')
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
x1++,y1++,x2++,y2++;
Updata(x2,y2);
Updata(x1-1,y2);
Updata(x2,y1-1);
Updata(x1-1,y1-1);
}
else if(s[0]=='Q')
{
scanf("%d%d",&i,&j);
printf("%d\n",Getsum(i,j)%2);
}
}
printf("\n");
}
return 0;
}
WA代码:
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
#define N 1005
int c[N][N];
int n;
int lowbit(int x)
{
return x&(-x);
}
void Updata(int x,int y)
{
for(int i=x;i<=n;i+=lowbit(i))
{
for(int j=y;j<=n;j+=lowbit(j))
{
if(c[i][j]==0)c[i][j]=1;
else if(c[i][j]==1)c[i][j]=0;
}
}
}
int main()
{
int t,oper;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&oper);
memset(c,0,sizeof(c));
int i,j,x1,y1,x2,y2;
char s[3];
while(oper--)
{
scanf("%s",s);
if(s[0]=='C')
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
x1++,y1++,x2++,y2++;
Updata(x2,y2);
Updata(x1-1,y2);
Updata(x2,y1-1);
Updata(x1-1,y1-1);
}
else if(s[0]=='Q')
{
scanf("%d%d",&i,&j);
printf("%d\n",c[i][j]);
}
}
printf("\n");
}
return 0;
}