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 ...
随机推荐
- 解决Establishing SSL connection without server‘s identity verification is not recommended.
每次从数据库中进行查询或者其他操作控制台都会出现以下警告,虽说不是error,但是很显眼.. WARN: Establishing SSL connection without server's id ...
- PAT甲级 1155 Heap Paths (30分) 堆模拟
题意分析: 给出一个1000以内的整数N,以及N个整数,并且这N个数是按照完全二叉树的层序遍历输出的序列,输出所有的整条的先序遍历的序列(根 右 左),以及判断整棵树是否是符合堆排序的规则(判断是大顶 ...
- Hadoop源码:namenode格式化和启动过程实现
body { margin: 0 auto; font: 13px / 1 Helvetica, Arial, sans-serif; color: rgba(68, 68, 68, 1); padd ...
- Windows Server 2012 R2远程桌面默认端口修改
修改3389默认端口可使服务器安全性进一步提升,可以避免阻断大部分的恶意暴力密码爆破. 在开始--运行菜单里,输入regedit 或者: 远程登陆服务器选择系统桌面中的"Windows Po ...
- CS远控
Cobaltstrike 一.基础使用 ./teamserver 192.168.43.224 123456 启动服务器端 在windows下的链接 双击bat文件即可 在linux下 ./start ...
- PeleeNet:精修版DenseNet,速度猛增至240FPS | NeurIPS 2018
PeleeNet是DenseNet的一个变体,没有使用流行的深度可分离卷积,PeleeNet和Pelee仅通过结构上的优化取得了很不错的性能和速度,读完论文可以学到很多网络设计的小窍门. 来源:晓 ...
- luogu P4116 Qtree3
题目描述 给出N个点的一棵树(N-1条边),节点有白有黑,初始全为白 有两种操作: 0 i : 改变某点的颜色(原来是黑的变白,原来是白的变黑) 1 v : 询问1到v的路径上的第一个黑点,若无,输出 ...
- IE双击打不开解决办法
方法1 [百度电脑专家]一键修复 建议下载并安装[百度电脑专家],官网:http://zhuanjia.baidu.com .打开[百度电脑专家],在搜索框内输入"IE修复",在搜 ...
- 【python刷题】LRU
什么是LRU? LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰.该算法赋予每个页面一个访问字段,用来记录一个页面自上次 ...
- Spring常见问题总结
1. 什么是 Spring 框架? Spring 是一种轻量级开发框架,旨在提高开发人员的开发效率以及系统的可维护性.Spring 官网:https://spring.io/. 我们一般说 Sprin ...