题意:有一个n*n(n<=1000) 的矩阵,开始时全为零,现在有两种操作
(1)"C x1 y1 x2 y2“表示将以(x1,y1)为左上顶点,以(x2,y2)为右下顶点的长方形区域内的值全部取反。
(2)”Q x y“表示点(x,y)的值。
具体思路参考国家集训队2009论文集浅谈信息学竞赛中的0和1“;
我自己用的是二维线段树。
View Code
1 #include <cstdio> 2 #include <algorithm> 3 using namespace std; 4 #define maxn 1002 5 #define lson l,m,rt<<1 6 #define rson m+1,r,rt<<1|1 7 int n; 8 struct node 9 { 10 int subsetree[maxn*3]; 11 }setree[maxn*3]; 12 void subbuild(int num,int l,int r,int rt) 13 { 14 setree[num].subsetree[rt]=0; 15 if(l==r) 16 return; 17 int m=(l+r)>>1; 18 subbuild(num,lson); 19 subbuild(num,rson); 20 } 21 void build(int l,int r,int rt) 22 { 23 subbuild(rt,1,n,1); 24 if(l==r) 25 return; 26 int m=(l+r)>>1; 27 build(lson); 28 build(rson); 29 } 30 void subupdate(int num,int l,int r,int rt,int x1) 31 { 32 setree[num].subsetree[rt]++; 33 if(l==r) 34 return; 35 int m=(l+r)>>1; 36 if(x1<=m) 37 subupdate(num,lson,x1); 38 else if(x1>m) 39 subupdate(num,rson,x1); 40 } 41 void update(int l,int r,int rt,int x1,int y1) 42 { 43 subupdate(rt,1,n,1,y1); 44 if(l==r) 45 return; 46 int m=(l+r)>>1; 47 if(x1<=m) 48 update(lson,x1,y1); 49 else if(x1>m) 50 update(rson,x1,y1); 51 } 52 int subquery(int num,int l,int r,int rt,int l1,int r1) 53 { 54 if(l1<=l&&r<=r1) 55 return setree[num].subsetree[rt]; 56 int m=(l+r)>>1; 57 int ans=0; 58 if(l1<=m) 59 ans+=subquery(num,lson,l1,r1); 60 if(r1>m) 61 ans+=subquery(num,rson,l1,r1); 62 return ans; 63 64 } 65 int query(int l,int r,int rt,int l1,int r1,int l2,int r2) 66 { 67 if(l1<=l&&r<=r1) 68 return subquery(rt,1,n,1,l2,r2); 69 int m=(l+r)>>1; 70 int ans=0; 71 if(l1<=m) 72 ans+=query(lson,l1,r1,l2,r2); 73 if(r1>m) 74 ans+=query(rson,l1,r1,l2,r2); 75 return ans; 76 } 77 int main() 78 { 79 int t; 80 scanf("%d",&t); 81 while(t--){ 82 int m; 83 scanf("%d%d",&n,&m); 84 n++; 85 build(1,n,1); 86 while(m--){ 87 char s[5]; 88 int x1,y1,x2,y2; 89 scanf("%s",s); 90 if(s[0]=='C'){ 91 scanf("%d%d%d%d",&x1,&y1,&x2,&y2); 92 update(1,n,1,x1,y1); 93 update(1,n,1,x2+1,y1); 94 update(1,n,1,x1,y2+1); 95 update(1,n,1,x2+1,y2+1); 96 } 97 else if(s[0]=='Q'){ 98 scanf("%d%d",&x1,&y1); 99 int ans=query(1,n,1,1,x1,1,y1); 100 printf("%d\n",ans%2); 101 } 102 } 103 putchar('\n'); 104 } 105 return 0; 106 }