Painting some colored segments on a line, some previously painted segments may be covered by some the subsequent ones.

Your task is counting the segments of different colors you can see at last.

输入:

The first line of each data set contains exactly one integer n, 1 <= n <= 8000, equal to the number of colored segments.

Each of the following n lines consists of exactly 3 nonnegative integers separated by single spaces:

x1 x2 c

x1 and x2 indicate the left endpoint and right endpoint of the segment, c indicates the color of the segment.

All the numbers are in the range [0, 8000], and they are all integers.

Input may contain several data set, process to the end of file.

输出:

Each line of the output should contain a color index that can be seen from the top, following the count of the segments of this color, they should be printed according to the color index.

If some color can’t be seen, you shouldn’t print it.

Print a blank line after every dataset.

Sample Input

5

0 4 4

0 3 1

3 4 2

0 2 2

0 2 3

4

0 1 1

3 4 1

1 3 2

1 3 1

6

0 1 0

1 2 1

2 3 1

1 2 0

2 3 0

1 2 1

    Sample Output

1 1

2 1

3 1

1 1

0 2

1 1

题意:这个题目和D - Mayor’s posters这个题目很相似,只是这个不需要映射,而那个题目需要

要注意的就是:我们的线段树只能存点,我们不能把一个[1,4]区间用四个点去存放,因为实际上区间长度为3,如果我们用[1,4]内所有点去存就表示长度为三

解决方法:

我们只需要再给出的区间在其左边界加一,或是在右边界减一从而使其区间中的点变得和区间长度一样

上代码;

#include<cstdio>

#include<cmath>

#include<algorithm>

#include<cstring>

using namespace std;

const int maxn=8005;

struct node

{

	int l,r,sum;

}a[maxn<<2];

int x1[maxn],x2[maxn],c[maxn];

int mark[maxn];

int sum[maxn];

int lenn; 

void build(int o,int l,int r)

{

	a[o].l=l,a[o].r=r,a[o].sum=-1;

	int ls=o<<1,rs=o<<1|1,mid=(l+r>>1);

	if(l==r)

	{

		a[o].sum=-1;

		return ;

	}

	build(ls,l,mid);

	build(rs,mid+1,r);

}

void pushdown(int o)

{

	   if(a[o].sum!=-1)

	   {

	   		a[o<<1].sum=a[o].sum;

	   		a[o<<1|1].sum=a[o].sum;

	   		a[o].sum=-1;

	   }

}

void update(int o,int l,int r,int c)

{

	int ls=o<<1,rs=o<<1|1,mid=(a[o].l+a[o].r)>>1;

	if(l<=a[o].l&&a[o].r<=r)

	{

		a[o].sum=c;

		return ;

	}

	pushdown(o);

	if(l<=mid) update(ls,l,r,c);

	if(r>mid) update(rs,l,r,c);

}

void query(int o,int l,int r)

{

	int ls=o<<1,rs=o<<1|1,mid=(a[o].l+a[o].r)>>1;

	if(a[o].l==a[o].r)

	{

		mark[lenn++]=a[o].sum;

		return ;

	}

	pushdown(o);

	if(l<=mid) query(ls,l,r);

	if(r>mid) query(rs,l,r);

}

int main()

{

	int n;

	while(~scanf("%d",&n))

	{

		int maxx=0;

		for(int i=0;i<n;i++)

		{

			scanf("%d%d%d",&x1[i],&x2[i],&c[i]);

			int x=max(x1[i]+1,x2[i]);

			maxx=max(maxx,x);

		}

		memset(mark,-1,sizeof(mark));

		build(1,1,maxx);

		for(int i=0;i<n;i++)	update(1,x1[i]+1,x2[i],c[i]);

		lenn=0;

		query(1,1,maxx);

		int x;

		memset(sum,0,sizeof(sum));

		for(int i=0;i<lenn;)

		{

			if(mark[i]==-1)	

			{

				i++;

				continue;

			}

			x=mark[i];

			while(x==mark[++i]&&i<lenn) ;

			sum[x]++;

		}

		for(int i=0;i<=maxx+10;i++)

		{

			if(sum[i]!=0)

				printf("%d %d\n",i,sum[i]);

		}

		printf("\n");  /注意不要忘了最后还有一个换行

	}

}

F - Count the Colors(线段树)的更多相关文章

  1. Count the Colors(线段树,找颜色段条数)

    Count the Colors Time Limit: 2 Seconds      Memory Limit: 65536 KB Painting some colored segments on ...

  2. zoj 1610 Count the Colors 线段树区间更新/暴力

    Count the Colors Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.zju.edu.cn/onlinejudge/show ...

  3. [ZOJ1610]Count the Colors(线段树,区间染色,单点查询)

    题目链接:http://www.icpc.moe/onlinejudge/showProblem.do?problemCode=1610 题意:给一个长8000的绳子,向上染色.一共有n段被染色,问染 ...

  4. ZOJ 1610 Count the Colors (线段树成段更新)

    题意 : 给出 n 个染色操作,问你到最后区间上能看见的各个颜色所拥有的区间块有多少个 分析 : 使用线段树成段更新然后再暴力查询总区间的颜色信息即可,这里需要注意的是给区间染色,而不是给点染色,所以 ...

  5. ZOJ 1610 Count the Colors(线段树,区间覆盖,单点查询)

    Count the Colors Time Limit: 2 Seconds      Memory Limit: 65536 KB Painting some colored segments on ...

  6. ZOJ-1610 Count the Colors ( 线段树 )

    题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1610 Description Painting some co ...

  7. ZOJ1610 Count the Colors —— 线段树 区间染色

    题目链接:https://vjudge.net/problem/ZOJ-1610 Painting some colored segments on a line, some previously p ...

  8. Count the Colors 线段树

    题目 参考博客地址 题意: n范围[1,8000] ,  li 和 ri 的范围[0,8000].  n个操作,每个操作是把 [li , ri]内的点修改成一个颜色c. n个操作过后,按颜色从小到大 ...

  9. F - Count the Colors

    F - Count the Colors ZOJ - 1610   思路:调了一个小时,但是发现自己线段树木有写错,颜色统计出了错误.但是不明白自己颜色统计为什么错了. 求大佬指点迷津.思路很简单,就 ...

  10. 【POJ 2777】 Count Color(线段树区间更新与查询)

    [POJ 2777] Count Color(线段树区间更新与查询) Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4094 ...

随机推荐

  1. 【JavaWeb】Servlet 程序

    Servlet 程序 Servlet Servlet 是在 Web 服务器中运行的小型 Java 程序.Servlet 通常通过 HTTP(超文本传输​​协议)接收和响应来自 Web 客户端的请求. ...

  2. 【C++】《C++ Primer 》第十四章

    第十四章 重载运算与类型转换 一.基本概念 重载运算符是具有特殊名字的函数:由关键字operator和其后要定义的运算符号共同组成.也包含返回类型.参数列表以及函数体. 当一个重载的运算符是成员函数时 ...

  3. Java 设置Excel条件格式(高亮条件值、应用单元格值/公式/数据条等类型)

    概述 在Excel中,应用条件格式功能可以在很大程度上改进表格的设计和可读性,用户可以指定单个或者多个单元格区域应用一种或者多种条件格式.本篇文章,将通过Java程序示例介绍条件格式的设置方法,设置条 ...

  4. SpringBoot同时接收单个对象和List<object>参数

    最近做项目的有个需求,是把多个文件移动到另一个文件夹下,这需要把 新的文件夹id -- Long类型 多个文件的信息 -- List< Object > 类型 这两个参数传给后台,我的后台 ...

  5. 转载 - Ubuntu源改国内源 与 批量更改ubuntu机器apt源

    change_apt_source.sh # !/bin/bash # 备份原来的源文件 cp /etc/apt/sources.list /etc/apt/sources.list.bak # 获取 ...

  6. ES6 自定义一个实现了Iterator接口的对象

    参考资料 var obj = { data: [1,2,3,4,5], // 这里实际上就是去定义如何实现Iterator接口 [Symbol.iterator](){ const that = th ...

  7. linux DRM GPU scheduler 笔记

    内核文档:   Overview   The GPU scheduler provides entities which allow userspace to push jobs into softw ...

  8. 24V转3.3V稳压芯片,高效率同步降压DC-DC变换器3A输出电流

    PW2312是一个高频,同步,整流,降压,开关模式转换器与内部功率MOSFET.它提供了一个非常紧凑的解决方案,以实现1.5A的峰值输出电流在广泛的输入电源范围内,具有良好的负载和线路调节. PW23 ...

  9. .NET Core使用Source Link提高源代码调试体验和生产效率

    前言: 在我们日常开发过程中常常会使用到很多其他封装好的第三方中间件(NuGet依赖项).类库或者是.NET框架中自带的库.但是当你想要对这些类库的方法设置断点调试,然后发现无法F11(逐语句)调试进 ...

  10. C# 正则表达式 -- 复习

    符号解释: \ 特殊的字符,转义 ^ 匹配输入的字符串的开始位置 $ 匹配输入的字符串的结束位置 * 匹配0次或多次,等价于{0,} + 匹配1次或多次,等价于{1,} ? 匹配0次或1次,等价于{0 ...