标签:
这道题搞了好久,其实坑点挺多。。
网上找了许多题解,发现思路其实都差不多,所以就不在重复了。
推荐一篇比较好的题解,请戳这。
另外,如果因为可能要更新多次,但最终查询只需要一次,所以没有写pushup函数,仅有一个pushdown。
1 #include <cstdio> 2 3 const int maxn = 131072; 4 //const int maxn = 10; 5 int qL, qR, op; 6 int setv[maxn << 2], xorv[maxn << 2]; 7 bool in[maxn + 10]; 8 9 void pushdown(int o) 10 { 11 int lc = o*2, rc = o*2+1; 12 if(setv[o] >= 0) 13 { 14 setv[lc] = setv[rc] = setv[o]; 15 setv[o] = -1; 16 xorv[lc] = xorv[rc] = 0; 17 } 18 if(xorv[o]) 19 { 20 if(setv[lc] >= 0) setv[lc] ^= 1; else xorv[lc] ^= 1; 21 if(setv[rc] >= 0) setv[rc] ^= 1; else xorv[rc] ^= 1; 22 xorv[o] = 0; 23 } 24 } 25 26 void update(int o, int L, int R, int qL, int qR) 27 { 28 if(qL <= L && qR >= R) 29 { 30 if(op == 1) { setv[o] = xorv[o] = 0; } 31 else if(op == 2) { setv[o] = 1; xorv[o] = 0; } 32 else if(op == 3) { if(setv[o] >= 0) setv[o] ^= 1; else xorv[o] ^= 1; } 33 return; 34 } 35 int M = (L + R) / 2; 36 pushdown(o); 37 if(qL <= M) update(o*2, L, M, qL, qR); 38 if(qR > M) update(o*2+1, M+1, R, qL, qR); 39 } 40 41 void query(int o, int L, int R) 42 { 43 if(setv[o] >= 0) 44 { 45 if(setv[o] == 1) for(int i = L; i <= R; i++) in[i] = true; 46 return; 47 } 48 pushdown(o); 49 if(L == R) return; 50 int M = (L + R) / 2; 51 query(o*2, L, M); 52 query(o*2+1, M+1, R); 53 } 54 55 char cmd, _left, _right; 56 57 int main() 58 { 59 //freopen("in.txt", "r", stdin); 60 61 while(scanf("%c %c%d,%d%c\n", &cmd, &_left, &qL, &qR, &_right) >= 0) 62 { 63 qL <<= 1; qR <<= 1; 64 if(_left == ‘(‘) qL++; if(_right == ‘)‘) qR--; 65 if(qL > qR && (cmd == ‘I‘ || cmd == ‘C‘)) { setv[1] = 0; xorv[1] = 0; continue; } 66 if(cmd == ‘U‘) { op = 2; update(1, 0, maxn, qL, qR); } 67 else if(cmd == ‘I‘) 68 { 69 op = 1; 70 if(qL - 1 >= 0) update(1, 0, maxn, 0, qL-1); 71 if(qR + 1 <= maxn) update(1, 0, maxn, qR+1, maxn); 72 } 73 else if(cmd == ‘D‘) { op = 1; update(1, 0, maxn, qL, qR); } 74 else if(cmd == ‘C‘) 75 { 76 op = 1; 77 if(qL - 1 >= 0) update(1, 0, maxn, 0, qL-1); 78 if(qR + 1 <= maxn) update(1, 0, maxn, qR+1, maxn); 79 op = 3; 80 update(1, 0, maxn, qL, qR); 81 } 82 else if(cmd == ‘S‘) { op = 3; update(1, 0, maxn, qL, qR); } 83 } 84 query(1, 0, maxn); 85 bool print = false; 86 int s = -1, e; 87 for(int i = 0; i <= maxn; i++) 88 { 89 if(in[i]) 90 { 91 if(s == -1) s = i; 92 e = i; 93 } 94 else if(s != -1) 95 { 96 if(print) printf(" "); 97 print = true; 98 printf("%c%d,%d%c", s&1?‘(‘:‘[‘, s>>1, (e+1)>>1, e&1?‘)‘:‘]‘); 99 s = -1; 100 } 101 } 102 103 if(!print) puts("empty set"); 104 105 return 0; 106 }
POJ 3225 (线段树 区间更新) Help with Intervals
标签:
原文地址:http://www.cnblogs.com/AOQNRMGYXLMV/p/4462657.html