这也是一本通上的一道分治的题目,简单的对题目分析来说,就是类似于下面这个手绘稿

(画的丑莫喷)


就是理解为对区间进行一个合并,最后输出所有合在一起的最后的闭区间的头尾

如果没有输出No、

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#define itn int
#define INF 0x3F3F3F3F
using namespace std;
struct code{
	int left;
	int right;
}a[100000];
int cmp(code p,code q){
	if(p.left==q.left )
        return p.right<q.right;
    else
        return p.left<q.left;
}
int main()
{
    int n;
    int i;
    int max=-INF;
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i].left>>a[i].right;
    sort(a+1,a+1+n,cmp);
 
    for(i=1;i<n;i++)
    {
        if(a[i].right>max)
            max=a[i].right;
        if(a[i+1].left>max)
        {
            cout<<"no"<<endl;
            return 0;
        }
    }
    if(a[i].right>max)
        max=a[i].right;
    cout<<a[1].left<<" "<<max;
    return 0;
}

  这个代码没加注释,就简单理解一下,宁们也方便ctrl+c ctrl+v

我定义了一个结构体,把每个区间当做是一个结构

每个的头为left 尾为right 把最大值定义为了0x3F3F3F3F,在输入之后,将其按照头的大小进行排序,方便操作,

  

int cmp(code p,code q){
	if(p.left==q.left )
        return p.right<q.right;
    else
        return p.left<q.left;
}

  利用这个对于大小方便比较

然后就是一个简单的循环模拟,最后输出就ok了

 

posted on 2020-05-25 16:25  月下诺  阅读(396)  评论(0编辑  收藏  举报

Live2D