首页 > 其他 > 详细

POJ 3225 Help with Intervals

时间:2015-12-03 22:56:35      阅读:344      评论:0      收藏:0      [点我收藏+]

线段树 区间更新 延迟标记

/* ***********************************************
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("\n");
    return 0;
}

 

POJ 3225 Help with Intervals

原文:http://www.cnblogs.com/zufezzt/p/5017563.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!