zoukankan      html  css  js  c++  java
  • poj 3225 Help with Intervals

    模版题,线段树区间赋值,反转,看别人代码敲的;

      1 #include<stdio.h>
      2 #include<string.h>
      3 #define MAXD 132000
      4 #define N 131070
      5 int tree[4 * MAXD], rev[4 * MAXD], to[4 * MAXD], a[MAXD];
      6 void build(int cur, int x, int y)
      7 {
      8     int mid = (x + y) >> 1, ls = cur << 1, rs = (cur << 1) | 1;
      9     tree[cur] = rev[cur] = 0;
     10     to[cur] = -1;
     11     if(x == y)
     12         return ;
     13     build(ls, x, mid);
     14     build(rs, mid + 1, y);
     15 }
     16 void pushdown(int cur)
     17 {
     18     int ls = cur << 1, rs = (cur << 1) | 1;
     19     if(to[cur] != -1)
     20     {
     21         to[ls] = to[rs] = to[cur];
     22         rev[ls] = rev[rs] = 0;
     23         tree[ls] = tree[rs] = to[cur];
     24         to[cur] = -1;
     25     }
     26     if(rev[cur])
     27     {
     28         rev[ls] = (rev[ls] + 1) & 1, rev[rs] = (rev[rs] + 1) & 1;
     29         tree[ls] ^= 1, tree[rs] ^= 1;
     30         rev[cur] = 0;
     31     }
     32 }
     33 void color(int cur, int x, int y, int s, int t, int c)
     34 {
     35     int mid = (x + y) >> 1, ls = cur << 1, rs = (cur << 1) | 1;
     36     if(x >= s && y <= t)
     37     {
     38         tree[cur] = to[cur] = c;
     39         rev[cur] = 0;
     40         return ;
     41     }
     42     pushdown(cur);
     43     if(mid >= s)
     44         color(ls, x, mid, s, t, c);
     45     if(mid + 1 <= t)
     46         color(rs, mid + 1, y, s, t, c);
     47 }
     48 void Reverse(int cur, int x, int y, int s, int t)
     49 {
     50     int mid = (x + y) >> 1, ls = cur << 1, rs = (cur << 1) | 1;
     51     if(x >= s && y <= t)
     52     {
     53         tree[cur] ^= 1;
     54         rev[cur] = (rev[cur] + 1) & 1;
     55         return ;
     56     }
     57     pushdown(cur);
     58     if(mid >= s)
     59         Reverse(ls, x, mid, s, t);
     60     if(mid + 1 <= t)
     61         Reverse(rs, mid + 1, y, s, t);
     62 }
     63 void dfs(int cur, int x, int y)
     64 {
     65     int mid = (x + y) >> 1, ls = cur << 1, rs = (cur << 1) | 1;
     66     if(x == y)
     67     {
     68         a[x] = tree[cur];
     69         return ;
     70     }
     71     pushdown(cur);
     72     dfs(ls, x, mid);
     73     dfs(rs, mid + 1, y);
     74 }
     75 void printresult()
     76 {
     77     int i, x, y, flag = 0;
     78     dfs(1, 0, N);
     79     for(i = 0; i <= N; i ++)
     80     {
     81         if(a[i])
     82         {
     83             if(flag)
     84                 printf(" ");
     85             else
     86                 flag = 1;
     87             if(i & 1)
     88                 printf("(%d,", i >> 1);
     89             else
     90                 printf("[%d,", i >> 1);
     91             for(; a[i + 1]; i ++);
     92             if(i & 1)
     93                 printf("%d)", (i + 1) >> 1);
     94             else
     95                 printf("%d]", i >> 1);
     96         }
     97     }
     98     if(flag == 0)
     99         printf("empty set\n");
    100     printf("\n");
    101 }
    102 void solve()
    103 {
    104     int x, y;
    105     char op[5], b[20];
    106     while(scanf("%s%s", op, b) == 2)
    107     {
    108         sscanf(b + 1, "%d,%d", &x, &y);
    109         if(b[0] == '(')
    110             x = (x << 1) | 1;
    111         else
    112             x <<= 1;
    113         if(b[strlen(b) - 1] == ')')
    114             y = (y << 1) - 1;
    115         else
    116             y <<= 1;
    117         if(op[0] == 'U')
    118             color(1, 0, N, x, y, 1);
    119         else if(op[0] == 'D')
    120             color(1, 0, N, x, y, 0);
    121         else if(op[0] == 'S')
    122             Reverse(1, 0, N, x, y);
    123         else if(op[0] == 'C')
    124         {
    125             if(x > 0)
    126                 color(1, 0, N, 0, x - 1, 0);
    127             if(y < N)
    128                 color(1, 0, N, y + 1, N, 0);
    129             Reverse(1, 0, N, x, y);
    130         }
    131         else
    132         {
    133             if(x > 0)
    134                 color(1, 0, N, 0, x - 1, 0);
    135             if(y < N)
    136                 color(1, 0, N, y + 1, N, 0);
    137         }
    138     }
    139     printresult();
    140 }
    141 int main()
    142 {
    143     build(1, 0, N);
    144     solve();
    145     return 0;
    146 }
  • 相关阅读:
    Java内部类与外部类的那些事
    TCP那些事
    Java的垃圾回收和内存分配策略
    HTTP的客户端识别与cookie机制
    HTTP缓存
    HTTP连接管理
    Java Native Interface 六JNI中的异常
    Java Native Interface 五 JNI里的多线程与JNI方法的注册
    Java Native Interface 四--JNI中引用类型
    Java Native Interfce三在JNI中使用Java类的普通方法与变量
  • 原文地址:https://www.cnblogs.com/yuzhaoxin/p/2655879.html
Copyright © 2011-2022 走看看