二维线段树
虽然是区间修改,但是还没有加lazy标记.
线段树的树套树还是需要多仔细理解下.
先放一个基本版本了...
以后再把lazy标记也加上.
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <ctime> 6 #include <climits> 7 #include <string> 8 #include <iterator> 9 #include <algorithm> 10 #include <cstdlib> 11 #include <queue> 12 #include <stack> 13 #include <list> 14 #include <map> 15 #include <set> 16 #include <vector> 17 #include <iterator> 18 using namespace std; 19 #define PI acos(-1.0) 20 #define INF 0x3f3f3f3f 21 #define inf 0x3f 22 #define MAXN 1005 23 #define MAXM 2000005 24 #define MOD 1000000007 25 #define EPS 1e-6 26 #define rst(a,b) memset(a, b, sizeof(a)) 27 #define pd(a) cout << "debug:" << a << " " 28 #define pp(a) cout << a << " " 29 #define pl(a) cout << a << endl 30 typedef long long LL; 31 typedef unsigned long long ULL; 32 typedef pair<int,int> pii; 33 struct node_y { 34 int l, r; 35 bool ans; 36 }; 37 struct node_x { 38 int l, r; 39 node_y tree_y[MAXN * 4]; 40 }tree_x[MAXN * 4]; 41 void build_y(int p, int v, int l, int r) { 42 tree_x[p].tree_y[v].l = l; 43 tree_x[p].tree_y[v].r = r; 44 tree_x[p].tree_y[v].ans = 0; 45 if(l == r) return; 46 int mid = (l+r) >> 1; 47 build_y(p, 2*v, l, mid); 48 build_y(p, 2*v+1, mid+1, r); 49 } 50 void build_x(int v, int l, int r, int n) { 51 tree_x[v].l = l; 52 tree_x[v].r = r; 53 build_y(v, 1, 1, n); 54 if(l == r) return; 55 int mid = (l+r) >> 1; 56 build_x(2*v, l, mid, n); 57 build_x(2*v+1, mid+1, r, n); 58 } 59 void update_y(int p, int v, int y1, int y2) { 60 if(tree_x[p].tree_y[v].l == y1 && tree_x[p].tree_y[v].r == y2) { 61 tree_x[p].tree_y[v].ans = !tree_x[p].tree_y[v].ans; 62 return; 63 } 64 int mid = (tree_x[p].tree_y[v].l + tree_x[p].tree_y[v].r) >> 1; 65 if(y2 <= mid) { 66 update_y(p, 2*v, y1, y2); 67 } else if(y1 > mid) { 68 update_y(p, 2*v+1, y1, y2); 69 } else { 70 update_y(p, 2*v, y1, mid); 71 update_y(p, 2*v+1, mid+1, y2); 72 } 73 } 74 void update_x(int v, int x1, int x2, int y1, int y2) { 75 if(tree_x[v].l == x1 && tree_x[v].r == x2) { 76 update_y(v, 1, y1, y2); 77 return; 78 } 79 int mid = (tree_x[v].l + tree_x[v].r) >> 1; 80 if(x2 <= mid) { 81 update_x(2*v, x1, x2, y1, y2); 82 } else if(x1 > mid) { 83 update_x(2*v+1, x1, x2, y1, y2); 84 } else { 85 update_x(2*v, x1, mid, y1, y2); 86 update_x(2*v+1, mid+1, x2, y1, y2); 87 } 88 } 89 bool ans; 90 void query_y(int p, int v, int y) { 91 ans ^= tree_x[p].tree_y[v].ans; 92 if(tree_x[p].tree_y[v].l == y && tree_x[p].tree_y[v].r == y) return; 93 int mid = (tree_x[p].tree_y[v].l + tree_x[p].tree_y[v].r) >> 1; 94 if(y <= mid) query_y(p, 2*v, y); 95 else query_y(p, 2*v+1, y); 96 } 97 void query_x(int v, int x, int y) { 98 query_y(v, 1, y); 99 if(tree_x[v].l == x && tree_x[v].r == x) return; 100 int mid = (tree_x[v].l + tree_x[v].r) >> 1; 101 if(x <= mid) query_x(2*v, x, y); 102 else query_x(2*v+1, x, y); 103 } 104 void solve() { 105 int cases; 106 scanf("%d", &cases); 107 for(int idx = 1; idx <= cases; idx++) { 108 int n, t; 109 scanf("%d %d", &n, &t); 110 build_x(1, 1, n, n); 111 while(t--) { 112 char op[2]; 113 scanf("%s", op); 114 if(op[0] == 'C') { 115 int x1, y1, x2, y2; 116 scanf("%d %d %d %d", &x1, &y1, &x2, &y2); 117 update_x(1, x1, x2, y1, y2); 118 } else { 119 int x, y; 120 scanf("%d %d", &x, &y); 121 ans = 0; 122 query_x(1, x, y); 123 printf("%d\n", ans); 124 } 125 } 126 puts(""); 127 } 128 } 129 void io() { 130 freopen("/home/mitrenick/ACM/input.txt", "r", stdin); 131 freopen("/home/mitrenick/ACM/output.txt", "w", stdout); 132 } 133 int main() { 134 //io(); 135 solve(); 136 return 0; 137 }

浙公网安备 33010602011771号