题解:
方法1:二维线段树。
方法2:经过一定转换之后可以转变为:点修改,区间查询,然后判断奇偶性的题目,可以写一个二维树状数组。具体的可以去看09年国家集训队武森《浅谈信息学竞赛中的“0” 和“ 1”》的论文
#include<iostream> #include<cstdio> #include<cstring> using namespace std; long long tree[1010][1010]; int n; inline int lowbit(int x) { return x&(-x); } void add(int x,int y,long long c) { for(int i=x;i<=n;i+=lowbit(i)) for(int j=y;j<=n;j+=lowbit(j)) tree[i][j]+=c; } long long getsum(int x,int y) { long long sum=0; for(int i=x;i>0;i-=lowbit(i)) for(int j=y;j>0;j-=lowbit(j)) sum+=tree[i][j]; return sum; } int main() { int sec,t; scanf("%d",&sec); for(int z=1;z<=sec;z++) { memset(tree,0,sizeof(tree)); scanf("%d%d",&n,&t); char s[10]; for(int p=1;p<=t;p++) { scanf("%s",s); if(s[0]=='C') { int x1,y1,x2,y2; scanf("%d%d%d%d",&x1,&y1,&x2,&y2); add(x1,y1,1); add(x2+1,y2+1,1); add(x1,y2+1,1); add(x2+1,y1,1); } else { int x,y; scanf("%d%d",&x,&y); printf("%I64d\n",getsum(x,y)%2); } } if(z<sec)printf("\n"); } return 0; }