poj 3225 Help with Intervals [선분 트 리]

3211 단어 cqueryIntervals
/ / 나 는 여전히 복잡 하 다 고 생각한다.
/*
  :    , , ,  
  :
           :( 0 1        ,-1               )
U:   [l,r]   1
I: [-∞,l)(r,∞]   0
D:   [l,r]   0
C: [-∞,l)(r,∞]   0 ,  [l,r]  0/1  
S:[l,r]  0/1  
          ,         0/1      ,           
             :         ,                 
                     
               ,       ,   0 1,          ,          

            2     (      ,           )
*/

#include <cstdio>
#include <cstdlib>
#define maxn 200000
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
int hash[maxn];
int cover[maxn<<2];//    
int covxor[maxn<<2];//    

void FXOR(int rt){
    if(cover[rt]!=-1) cover[rt]^=1;//          0  1,
    else covxor[rt]^=1;     //         .            ???????
}
void pushdown(int rt){//       .     .
    if(cover[rt]!=-1){
        cover[rt<<1]=cover[rt<<1|1]=cover[rt];
        covxor[rt<<1]=covxor[rt<<1|1]=covxor[rt];
        cover[rt]=-1;
    }
    if(covxor[rt]) {
        FXOR(rt<<1);
        FXOR(rt<<1|1);
        covxor[rt]=0;
    }
}
void update(char op,int L,int R,int l,int r,int rt){
    if(l>=L&&r<=R){
        if(op=='U'){
            cover[rt]=1;
            covxor[rt]=0;//                
        }
        if(op=='D'){
            cover[rt]=0;
            covxor[rt]=0;
        }
        if(op=='S'||op=='C'){
            FXOR(rt);
        }
        return ;
    }
    pushdown(rt);
    int m=(l+r)>>1;
    if(L<=m){
        update(op,L,R,lson);
    }
    else if(op=='I'||op=='C'){
        covxor[rt<<1]=cover[rt<<1]=0;
    }
    if(m<R){
        update(op,L,R,rson);
    }
    else if(op=='I'||op=='C'){
        covxor[rt<<1|1]=cover[rt<<1|1]=0;
    }
}
void query(int l,int r,int rt){
    if(cover[rt]==1){
        for(int i=l;i<=r;i++)
            hash[i]=true;
        return;
    }
    else if(cover[rt]==0) return;
    if(l==r) return ;
    pushdown(rt);
    int m=(l+r)>>1;
    query(lson);
    query(rson);
}
int main(){
    char op,l,r;
    int a,b;
    covxor[1]=cover[1]=0;
    while(~scanf("%c %c%d,%d%c
",&op,&l,&a,&b,&r)){ a<<=1; b<<=1; if(l=='(') a++; if(r==')') b--; if(a>b){ if(op=='C'||op=='I'){ cover[l]=covxor[l]=0; } } else update(op,a,b,0,maxn,1); // printf("flag
"); } query(0,maxn,1);//hash int f1=-1,f2; bool flag=false; for(int i=0;i<maxn;i++){ if(hash[i]){ if(f1==-1){ f1=i; } f2=i; } else { if(f1!=-1){ if(flag) printf(" "); flag=true; printf("%c%d,%d%c",f1&1?'(':'[',f1>>1,(f2+1)>>1,f2&1?')':']'); f1=-1; } } } if(!flag) printf("empty set"); puts(""); return 0; }

좋은 웹페이지 즐겨찾기