最少区间

给定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;
 }

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值