
这也是一本通上的一道分治的题目,简单的对题目分析来说,就是类似于下面这个手绘稿
(画的丑莫喷)
就是理解为对区间进行一个合并,最后输出所有合在一起的最后的闭区间的头尾
如果没有输出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了
浙公网安备 33010602011771号