• Count the Colors ZOJ


    #include<stdio.h>
    #include<iostream>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    const int MAXN=8010;
    struct Node
    {
        int l,r;
        int color;
    }tr[MAXN*3];
    int color[MAXN];
    int temp;
    void build(int i,int l,int r)
    {
        tr[i].l=l;
        tr[i].r=r;
        //-1表示没有颜色
        tr[i].color=-1;
        if(l+1==r)
            return;
        int mid=((l+r)>>1);
        build(i<<1,l,mid);
        build((i<<1)|1,mid,r);
    }
    void insert(int i,int l,int r,int c)
    {
        if(l==r)
            return;
        if(tr[i].color==c)
            return;
        if(l<=tr[i].l&&r>=tr[i].r)
        {
            tr[i].color=c;
            return;
        }
        //存在颜色,往下更新
        if(tr[i].color>=0)
        {
            tr[i<<1].color=tr[i].color;
            tr[(i<<1)|1].color=tr[i].color;
            //表示有多种颜色
            tr[i].color=-2;
        }
        int mid=((tr[i].l+tr[i].r)>>1);
        if(r<=mid) 
            insert(i<<1,l,r,c);
        else if(l>=mid) 
            insert((i<<1)|1,l,r,c);
        else
        {
            insert(i<<1,l,mid,c);
            insert((i<<1)|1,mid,r,c);
        }
        tr[i].color=-2;
    }
    //统计各颜色的段数
    void query(int i)
    {
        if(tr[i].color==-1)
        {
            temp=-1;
            return;
        }
        if(tr[i].color!=-2)
        {
            //temp存的是前一段的颜色
            if(tr[i].color!=temp)
            {
                color[tr[i].color]++;
                temp=tr[i].color;
            }
            return;
        }
        if(tr[i].l+1!=tr[i].r)
        {
            query(i<<1);
            query((i<<1)|1);
        }
    }
    int main()
    {
        int n,a,b,c;
        int Max;
        while(scanf("%d",&n)!=EOF)
        {
            build(1,0,8000);
            Max=0;
            while(n--)
            {
                scanf("%d%d%d",&a,&b,&c);
                insert(1,a,b,c);
                if(c>Max)
                    Max=c;
            }
            temp=-1;
            memset(color,0,sizeof(color));
            query(1);
            for(int i=0;i<=Max;i++)
                if(color[i])
                    printf("%d %d
    ",i,color[i]);
            printf("
    ");
        }
        return 0;
    }
  • 相关阅读:
    应用程序中的服务器错误,怎么解决
    日期格式
    怎样破解网页禁用鼠标右键
    web.config中配置页面出错后跳转指定错误页面
    无法复制文件
    jquery 上传图片即时预览功能
    jquery若干问题
    web.xml 中的listener、 filter、servlet 加载顺序及其详解
    使用jquery 对 radio 和 select 的各种操作.
    零散技术整理
  • 原文地址:https://www.cnblogs.com/QingyuYYYYY/p/12293887.html
Copyright © 2020-2023  润新知