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

#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");
    }
}
时间: 2024-10-16 13:37:35

ZOJ1610( 经典线段树涂色问题)的相关文章

POJ2777(线段树涂色问题)

Count Color Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 42828   Accepted: 12973 Description Chosen Problem Solving and Program design as an optional course, you are required to solve all kinds of problems. Here, we get a new problem.

ZOJ1610 Count the Colors 经典线段树染色问题

题意,给你n个  x,y,c,意思就是区间[x,y]被染成C色,但是颜色会被覆盖的,染色操作完成以后 问你每种颜色有多少段 并输出颜色编号id跟段数cnt 经典问题,不过写的有点撮吧,没去看别人的,这个方法应该是最传统的最普通的,常规的开数组记录,也许大神们有更高端的方法 #include<iostream> #include<cstdio> #include<list> #include<algorithm> #include<cstring>

poj 3667Hotel(经典线段树)

传送门:点击打开链接 题目大意: 有N个房间排在一列,有两种操作. 1:查询最靠左的长度为len的空房间,并且入住这些空房间. 2:以l开头,长度为r的房间退房.(如果本来就是空的 还是要退房). 解题思路: 一类经典的线段树题目.区间合并类. 容易想到在查询上做做手脚,这题就差不多了.问题在于维护哪些东西.由于两个子区间要求合并,那么可以记录一个前最长可用连续,后最长可用连续,和连续可用的最大值. 那么pushup函数和pushdown函数就很简单了. 下面就是查询:如果左区间的连续值是大于等

pku 2777(经典线段树染色问题)

Count Color Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 41202   Accepted: 12458 Description Chosen Problem Solving and Program design as an optional course, you are required to solve all kinds of problems. Here, we get a new problem.

FZU2105 Digits Count(经典 线段树)

Digits Count Time Limit:10000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Description Given N integers A={A[0],A[1],...,A[N-1]}. Here we have some operations: Operation 1: AND opn L R Here opn, L and R are integers. Fo

线段树---分析 &amp;&amp; 模板总结

线段树:(转) 数据结构专题---线段树:http://blog.csdn.net/metalseed/article/details/8039326 线段树总结:http://blog.csdn.net/shiqi_614/article/details/8228102 概述: 线段树,类似区间树,是一个完全二叉树,它在各个节点保存一条线段(数组中的一段子数组),主要用于高效解决连续区间的动态查询问题,由于二叉结构的特性,它基本能保持每个操作的复杂度为O(lgN)! 性质:父亲的区间是[a,b

线段树模板hdu 1754:I Hate It

I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 100523    Accepted Submission(s): 37845 Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的

【BZOJ4817】【SDOI2017】树点涂色 [LCT][线段树]

树点涂色 Time Limit: 10 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description Bob有一棵n个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色.Bob可能会进行这几种操作: 1 x: 把点x到根节点的路径上所有的点染上一种没有用过的新颜色. 2 x y: 求x到y的路径的权值. 3 x: 在以x为根的子

[BZOJ4817][SDOI2017]树点涂色(LCT+DFS序线段树)

4817: [Sdoi2017]树点涂色 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 692  Solved: 408[Submit][Status][Discuss] Description Bob有一棵n个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路 径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色.Bob可能会进行这几种操作: 1 x: 把点x到根节点的路径上所有的点染上一种