【题目描述】给定 nn 个闭区间 [ai;biai;bi ],其中i=1,2,...,ni=1,2,...,n 。任意两个相邻或相交的闭区间可以合并为一个闭区间。例如,[1;21;2 ] 和 [2;32;3 ] 可以合并为 [1;31;3 ],[1;31;3 ] 和 [2;42;4 ] 可以合并为 [1;41;4 ],但是[1;21;2 ] 和 [3;43;4 ] 不可以合并。 我们的任务是判断这些区间是否可以最终合并为一个闭区间,如果可以,将这个闭区间输出,否则输出nono 。 【输入】第一行为一个整数nn ,3≤n≤500003≤n≤50000 。表示输入区间的数量。 之后nn 行,在第ii 行上(1≤i≤n1≤i≤n ),为两个整数 aiai 和 bibi ,整数之间用一个空格分隔,表示区间 [ai;biai;bi ](其中 1≤ai≤bi≤100001≤ai≤bi≤10000 )。 【输出】输出一行,如果这些区间最终可以合并为一个闭区间,输出这个闭区间的左右边界,用单个空格隔开;否则输出 nono 。 【输入样例】5 5 6 1 5 10 10 6 9 8 10 【输出样例】1 10 |
题目链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1236
思路:排序
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct node
{
int x,y;
} A[50010];
int n;
int cmp(node a,node b)
{
if(a.x==b.x)
return a.y<b.y;
return a.x<b.x;
}
int main()
{
while(~scanf("%d",&n))
{
for(int i=0; i<n; i++)
scanf("%d%d",&A[i].x,&A[i].y);
sort(A,A+n,cmp);
int l=A[0].x,r=l,flag=1;
for(int i=0;i<n;i++)
{
if(A[i].x<=r)
r=max(r,A[i].y);
else
flag=0;
}
if(flag)
printf("%d %d\n",l,r);
else
printf("no\n");
}
}