码迷,mamicode.com
首页 > 其他好文 > 详细

ZOJ1610( 经典线段树涂色问题)

时间:2016-01-12 13:48:32      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:

#include"cstdio"
#include"algorithm"
#include"cstring"
using namespace std;
const int MAXN=8005;
struct node{
    int l,r;
    int flag;
}a[MAXN*4];

void build(int rt,int l,int r)
{
    a[rt].l=l;
    a[rt].r=r;
    a[rt].flag=-1;
    if(l==r)
    {
        return ;
    }
    int mid=(l+r)>>1;
    
    build(rt<<1,l,mid);
    build((rt<<1)|1,mid+1,r);
}

void pushDown(int rt)
{
    a[rt<<1].flag=a[(rt<<1)|1].flag=a[rt].flag;
//    a[rt].flag=-1;
}

void update(int rt,int l,int r,int val)
{
    if(a[rt].l==l&&a[rt].r==r)
    {
        a[rt].flag=val;
        return ;
    }
    
    if(a[rt].flag!=-1)    pushDown(rt);
    
    int mid=(a[rt].l+a[rt].r)>>1;
    
    if(r<=mid)    update(rt<<1,l,r,val);
    else if(mid<l) update((rt<<1)|1,l,r,val);
    else{
        update(rt<<1,l,mid,val);
        update((rt<<1)|1,mid+1,r,val);
    }
    
    if(a[rt<<1].flag!=a[(rt<<1)|1].flag)    a[rt].flag=-1;//-1代表两个子树的颜色不等或者没涂色 
    else    a[rt].flag=a[rt<<1].flag;
}

int seg[MAXN];
int x[MAXN];
void query(int rt)
{
    if(a[rt].flag!=-1)
    {
        for(int i=a[rt].l;i<=a[rt].r;i++)
        {
            seg[i]=a[rt].flag;//将每个片段的颜色用数组保存下来 
        }
        return ;
    }
    if(a[rt].l==a[rt].r)    return ;
    query(rt<<1);
    query((rt<<1)|1);
}

int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        int maxn=-1;
        build(1,1,8000);
        memset(seg,-1,sizeof(seg));
        memset(x,0,sizeof(x));
        while(n--)
        {
            int l,r,v;
            scanf("%d%d%d",&l,&r,&v);
            if(v>maxn)    maxn=v;
            update(1,l+1,r,v);
        }        
        query(1);
        int pre=-1;
        for(int i=1;i<=8000;i++)
        {
            if(pre!=seg[i]) 
            {
                pre=seg[i];
                x[pre]++;
            }
        }
        for(int i=0;i<=maxn;i++)
        {
            if(x[i]!=0)
            {
                printf("%d %d\n",i,x[i]);
            }
        }
        printf("\n");
    }    
}

 

ZOJ1610( 经典线段树涂色问题)

标签:

原文地址:http://www.cnblogs.com/program-ccc/p/5123996.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!