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 ...
随机推荐
- LeetCode108 将有序数组转为二叉搜索树
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定有序数组: [-10,-3,0, ...
- Flutter 应用入门:路由管理
路由(Route)在移动开发中通常指页面(Page),这跟web开发中单页应用的Route概念意义是相同的,Route在Android中通常指一个Activity,在iOS中指一个ViewContro ...
- 【RAC】通过命令查看当前数据库是不是rac
SQL> show parameter cluster_database 如果参数中显示的是 NAME TYPE ...
- 在.NET Core 中使用Quartz.NET
Quartz.NET是功能齐全的开源作业调度系统,可用于最小的应用程序到大型企业系统. Quartz.NET具有三个主要概念: job:运行的后台任务 trigger:控制后台任务运行的触发器. sc ...
- Spring Security 实战干货:AuthenticationManager的初始化细节
1. 前言 今天有个同学告诉我,在Security Learning项目的day11分支中出现了一个问题,验证码登录和其它登录不兼容了,出现了No Provider异常.还有这事?我赶紧跑了一遍还真是 ...
- 一文告诉你Java日期时间API到底有多烂
前言 你好,我是A哥(YourBatman). 好看的代码,千篇一律!难看的代码,卧槽卧槽~其实没有什么代码是"史上最烂"的,要有也只有"史上更烂". 日期是商 ...
- 抛弃 .NET 经典错误:object null reference , 使用安全扩展方法? 希望对大家有帮助---Bitter.Frame 引用类型的安全转换
还是一样,我不喜欢长篇大论,除非关乎我设计思想领域的文章.大家过来看,都是想节省时间,能用白话表达的内容,绝不长篇大论.能直接上核心代码的,绝不上混淆代码. 长期从事 .NET 工作的人都知道..NE ...
- centralized collectors 中心化 采集器
Fluent Bit https://fluentbit.io/ FluentBit is an open source specialized data collector. It provides ...
- WPF入门学习(转)
WPF基础知识 总结的学习WPF的几点基础知识: 1) C#基础语法知识(或者其他.NET支持的语言):这个是当然的了,虽然WPF是XAML配置的,但是总还是要写代码的,相信各位读者应该也都有这个基础 ...
- assets和static的区别
相同点:assets和static两个都是存放静态资源文件.项目中所需要的资源文件图片,字体图标,样式文件等都可以放在这两个文件下,这是相同点不相同点:assets中存放的静态资源文件在项目打包时,也 ...