51nod 1091线段的重叠
排序前
排序后
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <math.h>
using namespace std;
const int maxn=50005;//线段的数量
struct region{
int start;
int end;
}a[maxn];
int ans=0;
int n;
bool cmp(region x,region y)
{
if(x.start<y.start) return true;
if(x.start==y.start&&x.end>y.end) return true;
return false;
}
void solve()
{
sort(a,a+n,cmp);//起点升序 若起点相同,终点降序
region m=a[0];
for(int i=1;i<n;i++)
{
if(a[i].end<=m.end) //线段i在线段i-1内
ans=max(ans,a[i].end-a[i].start);
else
{
ans=max(ans,m.end-a[i].start); //线段i不在线段i-1内
m=a[i]; //选择最靠后的线段,更新
}
}
printf("%lld\n",ans);
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%lld%lld",&a[i].start,&a[i].end);
solve();
return 0;
}