给定n个闭区间 [ai, bi], i=1,2,…,n. 这些区间的并可以用两两不相交的闭区间的并来表示。你的任务是找到这样的两两不相交的闭区间数目最少的表示,且把它们按升序的方式写出。当且仅当a <= b < c <= d时,区间[a, b] 、[c, d]才是升序。
请写程序完成读取区间,然后计算出满足上述条件的两两不相交的区间,并且把找到的区间按升序输出。
Input
输入第一行只有一个数n,3 <= n <= 50000,代表区间数。第i+1行有两个整数ai, bi,之间用一个空格隔开,分别表示区间[ai, bi]的起始和结束(1 <= i <= n),1 <= ai <= bi <= 1000000。
Output
输出应该包含计算出的所有区间,每行写一个区间,每行只有两个数,分别是区间起始和结束,之间用一个空格分开。记住必须是按升序输出。
Sample Input
5
5 6
1 4
10 10
6 9
8 10
Sample Output
1 4
5 10
# include<algorithm> # include<iostream> using namespace std; const int maxn=50000+5; struct node{ int s,e; }a[maxn],b[maxn]; bool cmp(node x,node y) { return (x.s<y.s)||(x.s==y.s)&&(x.e<y.e); } int main() { int n,tot,r,l; while(cin>>n) { tot=0; for(int i=0;i<n;i++) { cin>>a[i].s>>a[i].e; } sort(a,a+n,cmp); r=a[0].s; l=a[0].e; for (int i = 1; i < n; i++) { if (l>= a[i].s) { if (l<a[i].e) l=a[i].e; } else { b[tot].s=r; b[tot].e=l; tot++; r=a[i].s; l= a[i].e; } } b[tot].s=r; b[tot].e=l; for(int i=0;i<=tot;i++) { cout<<b[i].s<<" "<<b[i].e<<endl; } } return 0; }