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

    线段树 区间更新 延迟标记

    /* ***********************************************
    Author        :Zhou Zhentao
    Email         :774388357@qq.com
    Created Time  :2015/12/2 21:13:05
    File Name     :main.cpp
    ************************************************ */
    
    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <queue>
    #include <set>
    #include <map>
    #include <string>
    #include <math.h>
    #include <stdlib.h>
    #include <time.h>
    using namespace std;
    
    const int maxn=66000*2;
    int a,b;  
    char op,lchar,rchar;
    struct SegTree
    {
        int Cover,Xor;
    }segTree[maxn*4];
    bool vis[maxn+10];
    
    void build(int l,int r,int rt)
    {
        segTree[rt].Cover=segTree[rt].Xor=0;
        if(l==r) return;
    
        int m=(l+r)/2;
        build(l,m,2*rt);
        build(m+1,r,2*rt+1);
    }
    
    void pushDown(int rt)
    {
        if(segTree[rt].Cover==1)
        {
            segTree[2*rt].Cover=segTree[2*rt+1].Cover=1;
            segTree[2*rt].Xor=segTree[2*rt+1].Xor=0;
    
        }
    
        else if(segTree[rt].Cover==0)
        {
            segTree[2*rt].Cover=segTree[2*rt+1].Cover=0;
            segTree[2*rt].Xor=segTree[2*rt+1].Xor=0;
        }
    
        else 
        {
            if(segTree[2*rt].Cover==1)
            {
                segTree[2*rt].Cover=0;
                segTree[2*rt].Xor=0;
            }
            else if(segTree[2*rt].Cover==0)
            {
                segTree[2*rt].Cover=1;
                segTree[2*rt].Xor=0;
            }
            else if(segTree[2*rt].Xor==0)
            {
                segTree[2*rt].Cover=-1;
                segTree[2*rt].Xor=1;
            }
            else if(segTree[2*rt].Xor==1)
            {
                segTree[2*rt].Cover=-1;
                segTree[2*rt].Xor=0;
            }
    
    
            if(segTree[2*rt+1].Cover==1)
            {
                segTree[2*rt+1].Cover=0;
                segTree[2*rt+1].Xor=0;
            }
            else if(segTree[2*rt+1].Cover==0)
            {
                segTree[2*rt+1].Cover=1;
                segTree[2*rt+1].Xor=0;
            }
            else if(segTree[2*rt+1].Xor==0)
            {
                segTree[2*rt+1].Cover=-1;
                segTree[2*rt+1].Xor=1;
            }
            else if(segTree[2*rt+1].Xor==1)
            {
                segTree[2*rt+1].Cover=-1;
                segTree[2*rt+1].Xor=0;
            }
        }
    
        segTree[rt].Cover=-1;
        segTree[rt].Xor=0;
    }
     
    void update(int L,int R,int info,int l,int r,int rt)
    {
        if(L<=l&&r<=R)
        {
            if(info!=2)
            {
                segTree[rt].Xor=0;
                segTree[rt].Cover=info;
            }
    
            else if(info==2)
            {
                if(segTree[rt].Cover==0) 
                {
                    segTree[rt].Cover=1;
                    segTree[rt].Xor=0;
                }
                else if(segTree[rt].Cover==1) 
                {
                    segTree[rt].Cover=0;
                    segTree[rt].Xor=0;
                }
                else if(segTree[rt].Xor==0) 
                {
                    segTree[rt].Xor=1;
                    segTree[rt].Cover=-1;
                }
                else if(segTree[rt].Xor==1) 
                {
                    segTree[rt].Xor=0;
                    segTree[rt].Cover=-1;
                }
            }
            return;
        }
    
        if(segTree[rt].Cover!=-1||segTree[rt].Xor!=0)
            pushDown(rt);
    
        int m=(l+r)/2;
        if(L<=m) update(L,R,info,l,m,2*rt);
        if(R>m) update(L,R,info,m+1,r,2*rt+1);
    }
    
    void quary(int l,int r,int rt)
    {
        if(segTree[rt].Cover==1||segTree[rt].Cover==0)
        {
            if(segTree[rt].Cover==1)
                for(int i=l;i<=r;i++) 
                    vis[i]=1;
            return;
        }
    
        if(l==r) return;
    
        if(segTree[rt].Cover!=-1||segTree[rt].Xor!=0)
            pushDown(rt);
    
        int m=(l+r)/2;
        quary(l,m,2*rt);
        quary(m+1,r,2*rt+1);
    }
    
    int main()
    {
        build(0,maxn,1);
        char s[100];
        while(gets(s))
        {
            int len=strlen(s),op,a=0,b=0;
            int i;
            for(i=3;i<len;i++)
            {
                if(!isdigit(s[i]))
                    break;
                a=a*10+s[i]-'0';
            }
            for(i++;i<len;i++)
            {
                if(!isdigit(s[i]))
                    break;
                b=b*10+s[i]-'0';
            }
    
            if(s[i]==']')
                b=b*2;
            else
                b=b*2-1;
            if(s[2]=='[')
                a=a*2;
            else
                a=a*2+1;
    
            if(b<a) 
            {
                if(op=='I' || op=='C') update(0,maxn,0,0,maxn,1);
                    continue;
            }
    
            op=s[0];
            if(op=='U') update(a,b,1,0,maxn,1);
            
            if(op=='I') 
            {
                if(a>0) update(0,a-1,0,0,maxn,1);
                if(b<maxn)update(b+1,maxn,0,0,maxn,1);
            }
    
            if(op=='D') update(a,b,0,0,maxn,1);
    
            if(op=='C')
            {
                if(a>0) update(0,a-1,0,0,maxn,1);
                if(b<maxn) update(b+1,maxn,0,0,maxn,1);
                update(a,b,2,0,maxn,1);
            }
    
            if(op=='S') update(a,b,2,0,maxn,1);
        }
    
        memset(vis,0,sizeof vis);
        quary(0,maxn,1);
    
        bool first=true;
        for(int i=0;i<maxn;i++)
        {
            if(vis[i]==1 && (i==0 || (i>0&&vis[i-1]==0) ))a=i;
            if(vis[i]==1 && (i==maxn-1 || vis[i+1]==0))
            {
                if(first)first=false;
                else printf(" ");
                if(a%2)printf("(");
                else printf("[");
                printf("%d,",a/2);
                printf("%d",(i+1)/2);
                if(i%2)printf(")");
                else printf("]");
            }
        }
        if(first)printf("empty set");
        printf("
    ");
        return 0;
    }
  • 相关阅读:
    js:DOM及其操作2
    js:DOM及其操作
    闭包,作用域,作用域链
    面向对象
    关于typeof
    javascript正则表达式&关键词检索
    关于StringAPI
    mybatis Invalid bound statement (not found)
    全国区域数据
    redis 问题整理
  • 原文地址:https://www.cnblogs.com/zufezzt/p/5017563.html
Copyright © 2011-2022 走看看