Luogu_2434_[SDOI2005]区间
题目描述
现给定n个闭区间[ai, bi],1<=i<=n。这些区间的并可以表示为一些不相交的闭区间的并。你的任务就是在这些表示方式中找出包含最少区间的方案。你的输出应该按照区间的升序排列。这里如果说两个区间[a, b]和[c, d]是按照升序排列的,那么我们有a<=b<c<=d。
请写一个程序:
读入这些区间;
计算满足给定条件的不相交闭区间;
把这些区间按照升序输出。
输入输出格式
输入格式
第一行包含一个整数n,3<=n<=50000,为区间的数目。以下n行为对区间的描述,第i行为对第i个区间的描述,为两个整数1<=ai<bi<=1000000,表示一个区间[ai, bi]。
输出格式
输出计算出来的不相交的区间。每一行都是对一个区间的描述,包括两个用空格分开的整数,为区间的上下界。你应该把区间按照升序排序。
样例
INPUT
5
5 6
1 4
10 10
6 9
8 10
OUTPUT
1 4
5 10
HINT
SOLUTION
差分
感觉差分是我们这种涉及区间的处理的问题的很重要的一个考虑方式啊qwq
接下来有10行废话。
这题不难。
我想过贪心,想过区间dp,想过建树bfs,就是没想到差分。
先看数据范围:\(3\leq n \leq 50000,1\leq a_i<b_i\leq 1000000\),
首先我们就把\(O(n^2)\)的方案给毙掉了。
这种题不是\(O(n)\)就是\(O(nlogn)\),对吧。
建树不好建,建了也不知道怎么写,毙掉。
就剩\(O(n)\)的了。
dp?怎么写啊?我不会,毙掉。
贪心把区间从头开始往后拓,直到出现断点?那万一全部连起来了呢?不好找断点,毙掉。
然后把目光放在这里:\(1\leq a_i<b_i\leq 1000000\),说不定有\(O(max(b_i))\)的写法呢?然后老老实实翻了题解。。。
所以我们考虑差分。
进来一个左端点就在相应位置+1,进来一个右端点就在相应位置-1,对,这就是典型的差分。
当我们的点的左边为正,而当前点为0,这说明有若干(也可能只有一)对区间从这里开始。
同理,当我们的点的右边为0,而当前点为0,这说明有若干(也可能只有一)对区间在这里完成了匹配,可以断开作为一段完整区间。
然后注意一下形同\([i,i]\)的区间要特判一下就可以了。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;
#define Min(a,b) ((a<b)?a:b)
#define Max(a,b) ((a>b)?a:b)
const int N=101000,M=1010000;
inline int read(){
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9') {x=x*10+ch-48;ch=getchar();}
return x*f;}
struct NODE{int d,u;}nd[N];
bool cmp(NODE a,NODE b) {return a.d<b.d;}
struct ITV{int l,r;}ans[N];
int n,itv[M],L=M,R=0;
int main(){
int i,j;
n=read();int cnt=0;
for (i=1;i<=n;++i){
nd[++cnt].d=read();nd[cnt].u=1;L=Min(L,nd[cnt].d);R=Max(R,nd[cnt].d);
nd[++cnt].d=read();nd[cnt].u=-1;L=Min(L,nd[cnt].d);R=Max(R,nd[cnt].d);}
memset(itv,0,sizeof(itv));
sort(nd+1,nd+1+cnt,cmp);
int p=1;cnt=0;
for (i=L;i<=R;++i){
itv[i]=itv[i-1];int flg=0,rec=0;
while ((nd[p].d==i)&&(p<=2*n)) {flg=1;rec+=nd[p].u;itv[i]+=nd[p].u;p++;}
if ((!itv[i-1])&&(flg)&&(!rec)) {ans[++cnt].l=i;ans[cnt].r=i;}//对于[i,i]型区间的特判
if ((!(itv[i-1]))&&(itv[i])) ans[++cnt].l=i;
else if ((itv[i-1])&&(!(itv[i]))) ans[cnt].r=i;
}
for (i=1;i<=cnt;++i) printf("%d %d\n",ans[i].l,ans[i].r);
return 0;
}
Luogu_2434_[SDOI2005]区间的更多相关文章
- 洛谷——P2434 [SDOI2005]区间
P2434 [SDOI2005]区间 题目描述 现给定n个闭区间[ai, bi],1<=i<=n.这些区间的并可以表示为一些不相交的闭区间的并.你的任务就是在这些表示方式中找出包含最少区间 ...
- 洛谷P2434 [SDOI2005]区间
题目描述 现给定n个闭区间[ai, bi],1<=i<=n.这些区间的并可以表示为一些不相交的闭区间的并.你的任务就是在这些表示方式中找出包含最少区间的方案.你的输出应该按照区间的升序排列 ...
- P2434 [SDOI2005]区间
题目描述 现给定n个闭区间[ai, bi],1<=i<=n.这些区间的并可以表示为一些不相交的闭区间的并.你的任务就是在这些表示方式中找出包含最少区间的方案.你的输出应该按照区间的升序排列 ...
- [SDOI2005]区间
题目描述 现给定n个闭区间[ai, bi],1<=i<=n.这些区间的并可以表示为一些不相交的闭区间的并.你的任务就是在这些表示方式中找出包含最少区间的方案.你的输出应该按照区间的升序排列 ...
- 【洛谷】P2434 [SDOI2005]区间(暴力)
题目描述 现给定n个闭区间[ai, bi],1<=i<=n.这些区间的并可以表示为一些不相交的闭区间的并.你的任务就是在这些表示方式中找出包含最少区间的方案.你的输出应该按照区间的升序排列 ...
- luogu P2434 [SDOI2005]区间
题目描述 现给定n个闭区间[ai, bi],1<=i<=n.这些区间的并可以表示为一些不相交的闭区间的并.你的任务就是在这些表示方式中找出包含最少区间的方案.你的输出应该按照区间的升序排列 ...
- 「LuoguP2434」 [SDOI2005]区间(贪心
Description 现给定n个闭区间[ai, bi],1<=i<=n.这些区间的并可以表示为一些不相交的闭区间的并.你的任务就是在这些表示方式中找出包含最少区间的方案.你的输出应该按照 ...
- 洛谷 2434 [SDOI2005]区间
[题解] 鲜活的大水题... 把区间排个序然后瞎搞就可以了,发现现在区间的左端点比之前区间的最大的右端点还大,那就增加一个答案区间.每次更新目前最大右区间. #include<cstdio> ...
- 题解 洛谷P2434 【[SDOI2005]区间】
本题的贪心策略是以区间起点位置由小到大排序,然后开始合并. 区间按起点顺序由小到大排序,可以最大化合并成功的可能. 这个脑补应该不难想出来.(读者自证不难 直接上代码: #include <bi ...
随机推荐
- IDEA中使用Lombok时候,getter,setter注解不生效/每次重启后才生效
Relevance.java代码如下: import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; imp ...
- win32概述
win32基于已有的框架 有意入口函数只有一个 都需要有一个主函数 所有程序的入口都是maincrtstartup tydedef 顾名思义 window是基于c,c++ 又想有自己所特有的数据类型 ...
- SVN解除与服务器的关联
1.随便找个地方新建个文本文档 2.粘贴如下内容到文档里,建议使用notepad++ Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\ ...
- 第04项目:淘淘商城(SpringMVC+Spring+Mybatis) 的学习实践总结【第四天】
https://pan.baidu.com/s/1bptYGAb#list/path=%2F&parentPath=%2Fsharelink389619878-229862621083040 ...
- 绿洲作业第二周 - 周二music work 音乐
Please kindly find the music work from Ms. Sophie. 1.请跟随附件中老师录制的视频进行学习和练习.(附件有带拼音的乐谱供KS1和外国学生使用) htt ...
- java select单线程 服务器
package com.Select; /** *select单线程 服务器 **/ import java.io.IOException; import java.net.InetSocketAdd ...
- 基于邻接表的长度为k的简单路径的求解
描述 一个连通图采用邻接表作为存储结构.设计一个算法,判断无向图中任意给定的两点是否存在一条长度为k的简单路径. 输入 多组数据,每组m+3数据行.第一行有两个数字n,m和k,代表有n个顶点,m条边和 ...
- vue中过滤器filter
Vue.js 允许我们自定义过滤器,可被用作一些常见的文本格式化.过滤器可以用在两个地方:mustache 插值表达式. v-bind表达式.过滤器应该被添加在 JavaScript 表达式的尾部,由 ...
- platform 平台驱动——设备的写作流程
说明:在内核源码里会有很多已经实现的驱动,对于我们来说只需要写好设备文件即可,但是我们如何知道驱动需要那些数据,以及有哪些驱动呢? 解决: 1.首先在内核源码目录下执行执行菜单配置命令: make m ...
- POJ-3264 Balanced Lineup(区间最值,线段树,RMQ)
http://poj.org/problem?id=3264 Time Limit: 5000MS Memory Limit: 65536K Description For the daily ...