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;
}
原文地址:https://www.cnblogs.com/zufezzt/p/5017563.html