zoukankan      html  css  js  c++  java
  • POJ 3325 Help with Intervals (线段树(难))

    题意:对空集S进行运算,问你S最后的区间表示

    解题思路:这题首先难下手的地方就是他的开区间与闭区间,这里我们要对数字乘以2(偶数代表端点,奇数代表区间),然后两个操作,覆盖和取反(自行思考),然后是5种情况,最后用hash记录覆盖区域输出,这题要注意的地方较多,在向下跟新的时候要有三种状态标记,和一种取反标记要注意,错了40次终于ac了,这题成功的把我poj的正确率拉低到了10% 以下。。

    解题代码:

      1 #include <stdio.h>
      2 #include <string.h>
      3 #include <stdlib.h>
      4 #define maxn 140000
      5 struct node
      6 {
      7     int l ,r , m, c ,f;
      8 } tree[maxn * 8];
      9 int L(int c)
     10 {
     11     return 2*c;
     12 }
     13 int R(int c)
     14 {
     15     return 2*c+1;
     16 }
     17 int hs[maxn*8];
     18 void build(int c, int p , int v )
     19 {
     20     tree[c].l = p;
     21     tree[c].r = v;
     22     tree[c].m = (p+v)/2;
     23     tree[c].c = 0 ;
     24     tree[c].f = 0 ;
     25     if(p == v)
     26         return;
     27     build(L(c),p,tree[c].m);
     28     build(R(c),tree[c].m+1,v);
     29 }
     30 void Fxor(int c)
     31 {
     32     if(tree[c].c != -1) tree[c].c ^= 1;
     33     else tree[c].f ^= 1;
     34 }
     35 void Pushdown(int c)
     36 {
     37     if(tree[c].c!= -1)
     38     {
     39         tree[L(c)].c = tree[c].c;
     40         tree[R(c)].c = tree[c].c;
     41         tree[R(c)].f = tree[L(c)].f = 0 ;
     42         tree[c].c = -1;
     43     }
     44     if(tree[c].f)
     45     {
     46         Fxor(L(c));
     47         Fxor(R(c));
     48         tree[c].f = 0 ;
     49     }
     50 
     51 
     52 }
     53 void update(int c , int p , int v ,int value )
     54 {
     55     if( p <= tree[c].l && v >= tree[c].r)
     56     {
     57         tree[c].c = value;
     58         tree[c].f = 0;
     59         return ;
     60     }
     61     Pushdown(c);
     62     if(v <= tree[c].m) update(L(c),p,v,value);
     63     else if(p > tree[c].m) update(R(c),p,v,value);
     64     else
     65     {
     66         update(L(c),p,tree[c].m,value);
     67         update(R(c),tree[c].m + 1 ,v,value);
     68     }
     69 }
     70 void fan(int c ,int p , int v)
     71 {
     72     if(p <= tree[c].l && v >= tree[c].r)
     73     {
     74         Fxor(c);
     75         return ;
     76     }
     77     Pushdown(c);
     78     if(v <= tree[c].m) fan(L(c),p,v);
     79     else if(p > tree[c].m) fan(R(c),p,v);
     80     else
     81     {
     82         fan(L(c),p,tree[c].m);
     83         fan(R(c),tree[c].m + 1 ,v);
     84     }
     85 }
     86 
     87 void geths(int c,int p ,int v )
     88 {
     89 
     90     if(p <= tree[c].l && v >= tree[c].r)
     91     {
     92         if(tree[c].c == 1)
     93         {
     94             for(int i = tree[c].l ; i <= tree[c].r ; i ++)
     95             {
     96                 hs[i] = 1;
     97             }
     98             return;
     99         }
    100 
    101     }
    102     if(tree[c].l == tree[c].r)
    103         return;
    104     Pushdown(c);
    105     if(v <= tree[c].m)  geths(L(c),p,v);
    106     else if(p > tree[c].m) geths(R(c),p,v);
    107     else
    108     {
    109         geths(L(c),p,tree[c].m);
    110         geths(R(c),tree[c].m+1,v);
    111     }
    112 }
    113 int main()
    114 {
    115     build(1,0,maxn*2);
    116     memset(hs,0,sizeof(hs));
    117 
    118     char op,l,r;
    119     int a,b;
    120     while(scanf("%c %c%d,%d%c",&op,&l,&a,&b,&r) != EOF)
    121     {
    122         getchar();
    123         a *= 2;
    124         b *= 2;
    125         if(l == '(')
    126             a++;
    127         if(r == ')')
    128             b--;
    129 
    130        //printf("%d %d
    ",a,b);
    131         if(a > b)
    132         {
    133             if(op == 'C' || op == 'I')
    134                 tree[1].c  = tree[1].f =  0 ;
    135             continue;
    136         }
    137         if(op == 'U')
    138         {
    139             update(1,a,b,1);
    140         }
    141         else if(op == 'I')
    142         {
    143             if(a != 0 )
    144             update(1,0,a -1,0);
    145             update(1,b +1 ,maxn,0);
    146         }
    147         else if(op == 'D')
    148         {
    149             update(1,a,b,0);
    150         }
    151         else if(op == 'C')
    152         {
    153             if(a != 0 )
    154             update(1,0,a-1,0);
    155             update(1,b+1,maxn,0);
    156             fan(1,a,b);
    157         }
    158         else
    159         {  // printf("*****
    ");
    160             fan(1,a,b);
    161         }
    162     
    163     }
    164      memset(hs,0,sizeof(hs));
    165         geths(1,0,maxn);
    166         int ok = 0 ;
    167         for(int i = 0 ; i <= maxn;)
    168         {
    169             if(hs[i] == 1)
    170             {
    171                 ok ++;
    172                 int be = i ;
    173                 while(hs[i] == 1 )
    174                     i++;
    175                 int en = i-1;
    176                 if(be % 2 == 1)
    177                 printf(ok == 1?"(%d,":" (%d,",be/2);
    178                 else
    179                 printf(ok == 1?"[%d,":" [%d,",be/2);
    180                 if(en % 2 == 0 )
    181                     printf("%d]",en/2);
    182                 else printf("%d)",en/2+ 1);
    183             }
    184             else
    185             {
    186                 i++;
    187             }
    188 
    189         }
    190         if(ok == 0 )
    191             printf("empty set");
    192         puts("");
    193 
    194     return 0 ;
    195 }
    View Code
    没有梦想,何谈远方
  • 相关阅读:
    MINA简单的介绍
    java classloader详解
    nginx 和 tomcat 组合搭建后端负载均衡
    nginx主要配置
    Mysql知识汇总笔记
    gradle 构建java工程
    决策树
    如何使用hadoop RPC机制
    PowerPoint插入公式快捷键
    C++基础
  • 原文地址:https://www.cnblogs.com/zyue/p/3252743.html
Copyright © 2011-2022 走看看