POJ 3225 (线段树 区间更新) Help with Intervals

这道题搞了好久,其实坑点挺多。。

网上找了许多题解,发现思路其实都差不多,所以就不在重复了。

推荐一篇比较好的题解,请戳这

另外,如果因为可能要更新多次,但最终查询只需要一次,所以没有写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 }
代码君

 

你可能感兴趣的:(with)