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