zoukankan      html  css  js  c++  java
  • poj3225 Help with Intervals

     操作含义:

    我们一个一个操作来分析:(用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互换

    COVER[ID]=1表示用1覆盖去见,COVER[ID]=0,表示用0覆盖区间,COVER[ID]=-1,表示其子区间既有1覆盖又有0覆盖的请款,

    对于每个节点使用覆盖或者异或操作标记延迟,1:如果一个区间遇上覆盖标记,则其异或标清空,2:如果一个区间是覆盖标记,pushdown操作使得其孩子区间的异或标志位变为0,孩子的覆盖标志等于其父代的标志。3如果其异或标记存在,Pushdown操作检查孩子的的覆盖标志,如果存在,则孩子覆盖标志直接变为原来的反,否者孩子的异或标志变为原来的反,异或1可以取得原来的反,4:操作保证每一个节点只存在一个覆盖标记或者异标志,

    #include<cstdio>
    #include<cstdlib>
    #include<cmath>
    #include<cstring>
    #define MAXN 131072
    int c_cover[MAXN<<2],c_xor[MAXN<<2];
    bool hash[MAXN+10];
    void update(char op,int left,int right,int l,int r,int id);
    void f_xor(int id);
    void push_down(int id);
    void push_down(int id);
    void query(int l,int r,int id);
    int main()
    {
        char op,c_left,c_right;
        int i,left,right;
        c_xor[1]=0;
            c_cover[1]=0;
        while(~scanf("%c %c%d,%d%c\n",&op,&c_left,&left,&right,&c_right))
        {
            left<<=1;
            right<<=1;
    
            if(c_left=='(')
                left++;
            if(c_right==')')
                right--;
            if(left>right)
            {
                if(op=='C'||op=='I')
                c_cover[1]=c_xor[1]=0;
            }
            else update(op,left,right,0,MAXN,1);
        }
            query(0,MAXN,1);
            int a=-1,b;
            bool flag=false;
            for(i=0;i<=MAXN;i++)
            {
                if(hash[i])
                   {
    
                       b=i;
                       if(a==-1)a=i;
    
    
                   }
               else if(a!=-1)
               {
                   if(flag)
                   printf(" ");
                   printf("%c%d,%d%c",a&1?'(':'[',a>>1,(b+1)>>1,b&1?')':']');
                       flag=true;
                       a=-1;
    
               }
            }
            if(!flag)
            printf("empty set");
            puts("");
    
    
    }
    void update(char op,int left,int right,int l,int r,int id)
    {
         if(left<=l&&right>=r)
         {
             if(op=='U')
             {
                 c_cover[id]=1;
                 c_xor[id]=0;
    
    
             }
             else if(op=='D')
             {
                 c_cover[id]=0;
                 c_xor[id]=0;
             }
             else if(op=='S'||op=='C')
             {
             f_xor(id);
             }
             return ;
        }
         push_down(id);
         int mid=(l+r)>>1;
         if(left<=mid)
             update(op,left,right,l,mid,id<<1);
         else if(op=='I'||op=='C')
         {
             c_cover[id<<1]=0;
             c_xor[id<<1]=0;
         }
         if(right>mid)
         {
             update(op,left,right,mid+1,r,id<<1|1);
         }
         else if(op=='I'||op=='C')
         {
             c_cover[id<<1|1]=0;
             c_xor[id<<1|1]=0;
         }
    
    
    
    
    
    
    
    }
    void f_xor(int id)
    {
        if(c_cover[id]!=-1)
            c_cover[id]^=1;
        else
            c_xor[id]^=1;
    }
    void push_down(int id)
    {
        if(c_cover[id]!=-1)
        {
            c_cover[id<<1]=c_cover[id<<1|1]=c_cover[id];
            c_xor[id<<1]=c_xor[id<<1|1]=0;
            c_cover[id]=-1;
    
        }
         if(c_xor[id])
        {
            f_xor(id<<1);
            f_xor(id<<1|1);
            c_xor[id]=0;
        }
    }
    void query(int l,int r,int id)
    {
        if(c_cover[id]==1)
        {
            int i;
            for(i=l;i<=r;i++)
            {
                hash[i]=1;
            }
            return ;
        }
        else if(c_cover[id]==0)
            return ;
        if(l==r)
            return ;
          push_down(id);
        int mid=(l+r)>>1;
        query(l,mid,id<<1);
        query(mid+1,r,id<<1|1);
    }
  • 相关阅读:
    DS博客作业02--栈和队列
    DS博客作业01-线性表
    c博客06-结构体&文件
    C博客作业05--2019-指针
    C语言博客作业04——数组
    C语言博客作业03--函数
    面向对象设计大作业第二阶段:图书馆系统
    JAVA程序设计-有理数类的设计
    DS博客作业05--查找
    DS博客作业04--图
  • 原文地址:https://www.cnblogs.com/woaiyy/p/2544497.html
Copyright © 2011-2022 走看看