给定若干闭区间,如果部分区间存在重合,覆盖,将这一部分区间用大区间覆盖起来,也就是合并连续的小区间。
摆在眼前有两种方法,一种是对左端点排序,一种是对右端点排序;
首先看左端点,由于左端点从小到大,所以在一个大区间内,其左端点是确定的,我们只需要不断扩展其右端点即可
再看对右端点排序,从左到右,右端点不断增大,最右端点无法确定,左端点更是如此,大小不一。画个图就会明白,右端点排序时,线段之间出现空隙的时候不一定代表出现断层,还可能在后面有一个左端点极小的,把它们都囊括,分析起来很复杂。
# include<iostream>
# include<algorithm>
# include<cstring>
# include<set>
using namespace std;
typedef long long int ll;
typedef struct
{
int left,right;
}qujian;
qujian s[50010];
bool cmp(qujian a,qujian b)
{
return a.left<b.left;
}
int main ()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>s[i].left>>s[i].right;
}
sort(s+1,s+1+n,cmp);
int left,right;
left=s[1].left;
right=s[1].right;
for(int i=1;i<=n;i++)
{
if(s[i].left>right) //发现新区间
{
cout<<left<<" "<<right<<'\n';
left=s[i].left;
right=s[i].right;
continue;
}
else
{
right=max(right,s[i].right); //扩展右端点
}
if(i==n)
{
cout<<left<<" "<<right; //最后别忘了最后一个区间
}
}
return 0;
}