zoukankan      html  css  js  c++  java
  • ZOJ 1610 间隔染色段树

    要长8000仪表板。间染色的范围,问:最后,能看到的颜色,而且颜色一共有段出现

    覆盖段


    数据对比水   水可太暴力

    段树:

    #include "stdio.h"
    #include "string.h"
    struct node
    {
        int l,r,c;
    }data[40010];
    
    int color[8011];
    void build(int l,int r,int k)
    {
        int mid;
        data[k].l=l;
        data[k].r=r;
        data[k].c=-1;
        if (l==r) return ;
    
        mid=(l+r)/2;
    
        build(l,mid,k*2);
        build(mid+1,r,k*2+1);
    }
    
    void updata(int l,int r,int k,int op)
    {
        int mid;
        if (data[k].c==op) return ;
    
        if (data[k].l==l && data[k].r==r)
        {
            data[k].c=op;
            return ;
        }
    
        if (data[k].c!=-1)
        {
            data[k*2].c=data[k*2+1].c=data[k].c;
            data[k].c=-1;
        }
    
        mid=(data[k].l+data[k].r)/2;
    
        if (r<=mid) updata(l,r,k*2,op);
        else
            if (l>mid) updata(l,r,k*2+1,op);
        else
        {
            updata(l,mid,k*2,op);
            updata(mid+1,r,k*2+1,op);
        }
    
        if (data[k*2].c==data[k*2+1].c) data[k].c=data[k*2].c;
        else data[k].c=-1;
    }
    
    void query(int k)
    {
        if (data[k].l==data[k].r)
        {
            color[data[k].l]=data[k].c;
            return ;
        }
        if (data[k].c!=-1)
            data[k*2].c=data[k*2+1].c=data[k].c;
        query(k*2);
        query(k*2+1);
    }
    int main()
    {
        int n,l,r,c,m,now,i;
        int sum[8011];
        m=8010;
        while (scanf("%d",&n)!=EOF)
        {
            build(0,m,1);
            while (n--)
            {
                scanf("%d%d%d",&l,&r,&c);
                r--;
                updata(l,r,1,c);
            }
            memset(color,-1,sizeof(color));
            query(1);
    
            memset(sum,0,sizeof(sum));
    
            now=color[0];
            sum[now]++;
            for (i=1;i<=m;i++)
            if (color[i]!=now)
            {
                now=color[i];
                sum[now]++;
            }
    
            for (i=0;i<=m;i++)
                if (sum[i]!=0) printf("%d %d
    ",i,sum[i]);
            printf("
    ");
        }
        return 0;
    }
    




    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    java要注意的问题1
    广义表(线性表的推广)
    java基本类型和包装器类
    面试题10:斐波那契数列
    面试题9:用两个栈实现队列
    面试题8:二叉树的下一个结点
    10 分组数据
    9 汇总数据
    8 使用数据处理函数
    7 创建计算字段
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4622017.html
Copyright © 2011-2022 走看看