洛谷 P2434 [SDOI2005]区间

来源:互联网 发布:mac seed 编辑:程序博客网 时间:2024/04/30 00:59

题目描述

现给定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]。

输出格式:

输出计算出来的不相交的区间。每一行都是对一个区间的描述,包括两个用空格分开的整数,为区间的上下界。你应该把区间按照升序排序。

输入输出样例

输入样例#1:
55 61 410 106 98 10
输出样例#1:
1 45 10最小线段覆盖,还不用求数量。。。简直就是引水入城的弱化版。。。
#include<algorithm>#include<iostream>#include<cstdio>using namespace std;const int N=50005;int n,cnt,lst;struct seq{int x,y;}a[N],b[N];bool cmp(seq c,seq d){return c.x<d.x;}int main(){scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d%d",&a[i].x,&a[i].y);sort(a+1,a+n+1,cmp);for(int i=1;i<=n;i++){if(lst<a[i].x)//接不上 b[cnt].y=lst,b[++cnt].x=a[i].x,lst=a[i].y;elselst=max(lst,a[i].y);}b[cnt].y=lst;for(int i=1;i<=cnt;i++)printf("%d %d\n",b[i].x,b[i].y);return 0;}

 
0 0