1.Matrix
//二维线段树
1 #include <iostream> 2 #include <cstring> 3 4 #define MAXN 1005 5 #define xlson kx<<1, xl, mid 6 #define xrson kx<<1|1, mid+1, xr 7 #define ylson ky<<1, yl, mid 8 #define yrson ky<<1|1, mid+1, yr 9 10 bool tree[MAXN<<2][MAXN<<2]; 11 int X; 12 int N, T; 13 int num, X1, X2, Y1, Y2; 14 char ch; 15 16 void editY(int kx, int ky, int yl, int yr) 17 { 18 if (Y1 <= yl && yr <= Y2) 19 { 20 tree[kx][ky] = !tree[kx][ky]; 21 return ; 22 } 23 int mid = (yl+yr)>>1; 24 if (Y1 <= mid) editY(kx, ylson); 25 if (Y2 > mid) editY(kx, yrson); 26 } 27 28 void editX(int kx, int xl, int xr) 29 { 30 if (X1 <= xl && xr <= X2) 31 { 32 editY(kx, 1, 1, N); 33 return ; 34 } 35 int mid = (xl+xr) >> 1; 36 if (X1 <= mid) editX(xlson); 37 if (X2 > mid) editX(xrson); 38 } 39 40 41 42 void queryY(int kx, int ky, int yl, int yr) 43 { 44 if (tree[kx][ky]) num++; 45 if (yl == yr) return ; 46 int mid = (yl+yr)>>1; 47 if (Y1 <= mid) queryY(kx, ylson); 48 else queryY(kx, yrson); 49 } 50 51 void queryX(int kx, int xl, int xr) 52 { 53 queryY(kx, 1, 1, N); 54 if (xl == xr) return ; 55 int mid = (xl+xr) >> 1; 56 if (X1 <= mid) queryX(xlson); 57 else queryX(xrson); 58 } 59 60 int main() 61 { 62 while (~scanf("%d", &X)) 63 while (X--) 64 { 65 memset(tree, 0, sizeof(tree)); 66 scanf("%d %d%*c", &N, &T); 67 for (int i = 0; i < T; ++i) 68 { 69 scanf("%c %d %d%*c", &ch, &X1, &Y1); 70 if (ch == ‘C‘) 71 { 72 scanf("%d %d%*c", &X2, &Y2); 73 editX(1, 1, N); 74 } 75 else 76 { 77 num = 0; 78 queryX(1, 1, N); 79 if (num & 1)printf("1\n"); 80 else printf("0\n"); 81 } 82 } 83 if (X) puts(""); 84 } 85 86 return 0; 87 }
原文:http://www.cnblogs.com/JustForCS/p/5000916.html