F - Count the Colors(线段树)
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(线段树)的更多相关文章
- Count the Colors(线段树,找颜色段条数)
		
Count the Colors Time Limit: 2 Seconds Memory Limit: 65536 KB Painting some colored segments on ...
 - zoj 1610 Count the Colors 线段树区间更新/暴力
		
Count the Colors Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.zju.edu.cn/onlinejudge/show ...
 - [ZOJ1610]Count the Colors(线段树,区间染色,单点查询)
		
题目链接:http://www.icpc.moe/onlinejudge/showProblem.do?problemCode=1610 题意:给一个长8000的绳子,向上染色.一共有n段被染色,问染 ...
 - ZOJ 1610 Count the Colors (线段树成段更新)
		
题意 : 给出 n 个染色操作,问你到最后区间上能看见的各个颜色所拥有的区间块有多少个 分析 : 使用线段树成段更新然后再暴力查询总区间的颜色信息即可,这里需要注意的是给区间染色,而不是给点染色,所以 ...
 - ZOJ 1610 Count the Colors(线段树,区间覆盖,单点查询)
		
Count the Colors Time Limit: 2 Seconds Memory Limit: 65536 KB Painting some colored segments on ...
 - ZOJ-1610 Count the Colors ( 线段树 )
		
题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1610 Description Painting some co ...
 - ZOJ1610 Count the Colors —— 线段树 区间染色
		
题目链接:https://vjudge.net/problem/ZOJ-1610 Painting some colored segments on a line, some previously p ...
 - Count the Colors 线段树
		
题目 参考博客地址 题意: n范围[1,8000] , li 和 ri 的范围[0,8000]. n个操作,每个操作是把 [li , ri]内的点修改成一个颜色c. n个操作过后,按颜色从小到大 ...
 - F - Count the Colors
		
F - Count the Colors ZOJ - 1610 思路:调了一个小时,但是发现自己线段树木有写错,颜色统计出了错误.但是不明白自己颜色统计为什么错了. 求大佬指点迷津.思路很简单,就 ...
 - 【POJ 2777】 Count Color(线段树区间更新与查询)
		
[POJ 2777] Count Color(线段树区间更新与查询) Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4094 ...
 
随机推荐
- LeetCode 二分查找模板 III
			
模板 #3: int binarySearch(vector<int>& nums, int target){ if (nums.size() == 0) return -1; i ...
 - Docker安装MySQL,Redis,阿里云镜像加速
			
Docker安装 虚拟化容器技术.Docker基于镜像,可以秒级启动各种容器.每一种容器都是一个完整的环境,容器之间相互隔离. 如果之前安装的有其他版本,卸载旧的版本. $ sudo yum remo ...
 - python sqlite3增加表字段
			
给sqlite3表格增加新字段,要注意大小写,要不然不成功. 一开始这样写,不成功! 后面规范写,按大小写严格规范写! 成功了!现在查看新增加的字段commit: 仔细看,这下全部小写,括表名称.co ...
 - 环境配置-Java-02-卸载
			
1.卸载程序 在windows程序与功能中卸载Java相关的两个程序 2.删除环境变量 在windows环境变量中删除JAVA_HOME.CLASSPATH 以及 PATH中的两条路径 3.查看是否卸 ...
 - Poj-P2533题解【动态规划】
			
本文为原创,转载请注明:http://www.cnblogs.com/kylewilson/ 题目出处: http://poj.org/problem?id=2533 题目描述: 如果ai1 < ...
 - [usaco2008 Oct]Pasture Walking 牧场旅行
			
题目描述 n个被自然地编号为1..n奶牛(1<=n<=1000)正在同样被方便的编号为1..n的n个牧场中吃草.更加自然而方便的是,第i个奶牛就在第i个牧场中吃草. 其中的一些对牧场被总共 ...
 - uni-app开发经验分享三: Vuex实现登录和用户信息留存
			
在做用户登录的过程中,其实最重要的是登录成功后的数据要怎么储存,储存到哪里,这里我分享一个利用vuex来实现用户登录和用户数据留存的方法 vuex代码如下: //引入vue和vuex import V ...
 - tcpdump安装与参数详解
			
Centos7安装Tcpdump 对于大部分的Linux操作系统,已经默认安装了tcpdump,可以通过以下命令查看: [root@localhost local]# tcpdump --versio ...
 - MySQL调优性能监控之show profile
			
用show profile查询工具指定具体的type show profile在mysql5.7之后过时 show profile命令用于跟踪执行过的sql语句的资源消耗信息,可以帮助查看sql语句的 ...
 - linux 文件结构体和文件描述符号的学习
			
https://blog.csdn.net/cywosp/article/details/38965239