傳送門:CDOJ1601
題目思路:
題目可以抽象爲在一個座標系中初始時所有點都爲0,然後有m次操作,有兩種
1,將一個矩形中的所有點都異或1,0變1,1變0,
2,查詢一個點的數
題目思路:
這種題可以是一個一維問題擴棧而來,一維就是在x軸上,矩形變成一段區間,對於一維我們只需在
a[l]+1,a[r+1]-1,當查詢是質詢查詢改點左邊的前綴和,因爲在區間內左邊有個+1區間外面抵消了,
而維護前綴和用個一維樹狀數組就可有,而這題我們可以用二維樹狀數組來維護,然後就是更新在那個
要變化,首先 (x1,y1) +1 ,因爲在區間都要保證有個加一,所以我們可以想到在(x1,y2+1)和(x2+1,y1) -1
然後還要個加一來抵消,那就是(x2+1,y2+1)
AC代碼:
#include<bits/stdc++.h>
using namespace std;
int a[1005][1005];
int get(int x){return x&(-x);}
void add(int x,int y,int v)
{
for(;x<=1000;x+=get(x))
{
for(int i=y;i<=1000;i+=get(i))
{
a[x][i]+=v;
}
}
}
int sum(int x,int y)
{
int res= 0;
for(;x>0;x-=get(x))
{
for(int i=y;i>0;i-=get(i))
{
res+=a[x][i];
}
}
return res;
}
int main()
{
int t;cin>>t;
while(t--)
{
int q;scanf("%d",&q);
memset(a,0,sizeof(a));
while(q--)
{
char ch[5];
int a,b,c,d;
scanf("%s",ch);
if(ch[0]=='C')
{
scanf("%d%d%d%d",&a,&b,&c,&d);
add(a,b,1);
add(c+1,d+1,1);
add(a,d+1,-1);
add(c+1,b,-1);
}
else
{
scanf("%d%d",&a,&b);
int ans = sum(a,b);
printf("%d\n",ans%2);
}
}
}
return 0;
}