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. Vue.nextTick()的使用

    什么是Vue.nextTick()?? 定义:在下次 DOM 更新循环结束之后执行延迟回调.在修改数据之后立即使用这个方法,获取更新后的 DOM. 所以就衍生出了这个获取更新后的DOM的Vue方法.所 ...

  2. 【Java基础】Eclipse 和数组

    Eclipse 和数组 Eclipse 安装和使用 ... 数组的概述 数组(Array):是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理. 数组相 ...

  3. 剑指offer 面试题0:高质的代码:即考虑边界条件、特殊输入和错误处理

    Q:把一个字符串转换为整数. A1:一个普通但漏洞百出的解法. int StrToInt(char* str) { int number = 0; while (*str != 0) { number ...

  4. 号称能将STW干掉1ms的Java垃圾收集器ZGC到底是个什么东西?

    ZGC介绍 ZGC(The Z Garbage Collector)是JDK 11中推出的一款追求极致低延迟的实验性质的垃圾收集器,它曾经设计目标包括: 停顿时间不超过10ms: 停顿时间不会随着堆的 ...

  5. Windows系统使用运行框运行程序

    配置步骤 1. 在非系统盘创建一个新文件夹,自定义名称.将需要使用运行框启动的程序或文件放入文件夹,并将其更改为自己容易记忆的名称 2. 创建环境变量 右击 "此电脑" → &qu ...

  6. Ice系列--强大如我IceGrid

    前言 IceGrid是一个提供服务定位和服务激活的组件,但它的功能远不止于此.从它的命名可以看出它的设计理念-网格计算(grid computing).网格计算被定义为由一系列关联的廉价计算机组成的计 ...

  7. ATtiny3217 x WS2812B梦幻联动

    TinyAVR 1-series是Microchip于2018年推出的AVR单片机系列,定位是新一代的8位单片机,ATtiny3217是其中最高端的一款.相比于ATmega328P那个时代的AVR,A ...

  8. 前端面试之HTTP状态码!

    前端面试之HTTP协议的东西! 一次HTTP请求的流程! HTTP 状态码 成功响应(200–299) 状态码 含义 200 请求成功 201 该请求已成功,并因此创建了一个新的资源.这通常是在POS ...

  9. Linux kernel 同步机制

    Linux kernel同步机制(上篇) https://mp.weixin.qq.com/s/mosYi_W-Rp1-HgdtxUqSEgLinux kernel 同步机制(下篇) https:// ...

  10. git branch --set-upstream-to=

    test@uat:/usr/server/app_server# git config --local -lcore.repositoryformatversion=0core.filemode=tr ...