二维线段树

虽然是区间修改,但是还没有加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 }

 

posted @ 2015-05-14 21:19  Mite  阅读(390)  评论(0)    收藏  举报