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. 【Flutter】容器类组件之变换

    前言 Transform可以在其子组件绘制时对其应用一些矩阵变换来实现一些特效. 接口描述 const Transform({ Key key, @required this.transform, t ...

  2. python中列表的insert和append的效率对比

    python中insert和append方法都可以向列表中插入数据只不过append默认插入列表的末尾,insert可以指定位置插入元素. 我们来测试一下他俩插入数据的效率: 测试同时对一个列表进行插 ...

  3. [从源码学设计]蚂蚁金服SOFARegistry之续约和驱逐

    [从源码学设计]蚂蚁金服SOFARegistry之续约和驱逐 目录 [从源码学设计]蚂蚁金服SOFARegistry之续约和驱逐 0x00 摘要 0x01 业务范畴 1.1 失效剔除 1.2 服务续约 ...

  4. Docker构建Python Web环境

    出于寻找Docker对Python相关项目部署的学习,找到腾讯课堂NEXT公开课中[Docker构建Python Web环境]的课程,本文对其进行内容梳理及知识点汇总. 该课程总计6小时左右,是个适合 ...

  5. LeetCode993. 二叉树的堂兄弟节点

    题目 1 class Solution { 2 public: 3 TreeNode* r1;TreeNode* r2; 4 bool isCousins(TreeNode* root, int x, ...

  6. 如何用Python中自带的Pandas和NumPy库进行数据清洗

    一.概况 1.数据清洗到底是在清洗些什么? 通常来说,你所获取到的原始数据不能直接用来分析,因为它们会有各种各样的问题,如包含无效信息,列名不规范.格式不一致,存在重复值,缺失值,异常值等..... ...

  7. 边缘计算k8s集群SuperEdge初体验

    前言 手上一直都有一堆的学生主机,各种各样渠道途径拿来的机器. 一直管理里面都比较蛋疼,甚至也不太记得住它们在哪是什么IP,管理起来很是头疼. 有阵子空闲的时候想折腾了一下边缘计算集群方案. 希望能把 ...

  8. [Usaco2008 Nov]Buying Hay 购买干草

    题目描述 约翰的干草库存已经告罄,他打算为奶牛们采购H(1≤H≤50000)磅干草,他知道N(1≤N≤100)个干草公司,现在用1到N给它们编号.第i个公司卖的干草包重量为Pi(1≤Pi≤5000)磅 ...

  9. 什么是Etcd,如何运维Etcd ?

    介绍 ETCD 是一个分布式.可靠的 key-value 存储的分布式系统,用于存储分布式系统中的关键数据:当然,它不仅仅用于存储,还提供配置共享及服务发现:基于Go语言实现. ETCD的特点 简单: ...

  10. CISCO 如何重置3850交换机密码

    SUMMARY STEPS: Connect a terminal or PC to the switch. Set the line speed on the emulation software ...