zoukankan      html  css  js  c++  java
  • poj3225Help with Intervals(线段树求区间交并补)

    http://poj.org/problem?id=3225

    先贴代码 有空再解释

    View Code
      1 #include <iostream>
      2 #include<cstdio>
      3 #include<cstring>
      4 #include<algorithm>
      5 using namespace std;
      6 #define N 140000
      7 int s[N<<2],kc[N<<2],hash[N];
      8 void build(int l,int r,int w)
      9 {
     10     kc[w] = 0;
     11     s[w] = 0;
     12     if(l==r)
     13     return ;
     14     int m = (l+r)>>1;
     15     build(l,m,w<<1);
     16     build(m+1,r,w<<1|1);
     17 }
     18 void fxor(int w)
     19 {
     20     if(s[w]!=-1)
     21     s[w]^=1;
     22     else
     23     kc[w]^=1;
     24 }
     25 void pushdown(int w)
     26 {
     27     if(s[w]!=-1)
     28     {
     29         s[w<<1] = s[w<<1|1] = s[w];
     30         kc[w<<1] = kc[w<<1|1]= 0;
     31         s[w] = -1;
     32     }
     33     if(kc[w])
     34     {
     35         fxor(w<<1);
     36         fxor(w<<1|1);
     37         kc[w] = 0;
     38     }
     39 }
     40 void update(int a,int b,char c,int l,int r,int w)
     41 {
     42     int i;
     43     if(a<=l&&b>=r)
     44     {
     45         if(c=='U')
     46         {
     47             s[w] = 1;
     48             kc[w] = 0;
     49         }
     50         else
     51         if(c=='D')
     52         {
     53             s[w] = 0;
     54             kc[w] = 0;
     55         }
     56         else
     57         if(c=='C'||c=='S')
     58         fxor(w);
     59         return ;
     60     }
     61     pushdown(w);
     62     int m = (l+r)>>1;
     63     if(a<=m)
     64     update(a,b,c,l,m,w<<1);
     65     else
     66     {
     67         if(c=='C'||c=='I')
     68         {
     69             s[w<<1] = 0;
     70             kc[w<<1] = 0;
     71         }
     72     }
     73     if(b>m)
     74     update(a,b,c,m+1,r,w<<1|1);
     75     else
     76     {
     77         if(c=='C'||c=='I')
     78         {
     79             s[w<<1|1] = 0;
     80             kc[w<<1|1] = 0;
     81         }
     82     }
     83 }
     84 void query(int l,int r,int w)
     85 {
     86     if(s[w]==1)
     87     {
     88         for(int i = l ; i <= r ; i++)
     89         hash[i] = 1;
     90         return ;
     91     }
     92     else
     93     if(s[w]==0)
     94     return ;
     95     if(l==r)
     96     return ;
     97     pushdown(w);
     98     int m = (l+r)>>1;
     99     query(l,m,w<<1);
    100     query(m+1,r,w<<1|1);
    101 }
    102 int main()
    103 {
    104     int a,b,i,j,k,n;
    105     char c,c1,c2;
    106     build(0,N,1);
    107     while(scanf("%c %c%d,%d%c%*c",&c,&c1,&a,&b,&c2)!=EOF)
    108     {
    109                a <<= 1;
    110         b <<= 1;
    111         if(c1=='(')
    112            a++;
    113         if(c2==')')
    114            b--;
    115         if(a>b)
    116         {
    117             if(c=='C'||c=='I')
    118             s[1] = kc[1] = 0;
    119         }
    120         else
    121         update(a,b,c,0,N,1);
    122      }
    123     query(0,N,1);
    124     int f = 0,w = 0,flag = 0;
    125     for(i = 0; i <= N ; i++)
    126     {
    127         if(!f&&hash[i])
    128         {
    129             if(flag)
    130             printf(" ");
    131             if(i%2!=0)
    132             printf("(");
    133             else
    134             printf("[");
    135             printf("%d,",i/2);
    136             f = 1;
    137             flag = 1;
    138             w = 0;
    139         }
    140         else
    141         if(!hash[i]&&!w&&f)
    142         {
    143             int ii=i;
    144             if(ii%2==0)
    145             ii++;
    146             else
    147             ii--;
    148             printf("%d",ii/2);
    149             if(ii%2!=0)
    150             printf(")");
    151             else
    152             printf("]");
    153             f = 0;
    154             w = 1;
    155         }
    156         else
    157         if(!hash[i])
    158         f = 0;
    159     }
    160     if(!flag)
    161     cout<<"empty set\n";
    162     return 0;
    163 }
  • 相关阅读:
    教研室课题卫星通信系统
    html5学习笔记03. Canvas简介,Canvas的使用方法
    ARCGIS RUNTIME FOR IOS总结(一)
    ARCGIS RUNTIME FOR IOS总结(三)
    html5学习笔记05.JavaScript 中的面向对象,继承和封装
    JAVA排序算法之 选择排序
    ARCGIS RUNTIME FOR IOS总结(六)
    ASP upload
    问题一百三十:字符矩阵排序
    美妙的微机原理2013/5/1
  • 原文地址:https://www.cnblogs.com/shangyu/p/2733050.html
Copyright © 2011-2022 走看看