X 轴上有 N 条线段,每条线段包括 1 个起点和终点。线段的重叠是这样来算的, [10 20] 和 [12 25] 的重叠部分为 [12 20] 。
给出 𝑁 条线段的起点和终点,从中选出 2 条线段,这两条线段的重叠部分是最长的。输出这个最长的距离。如果没有重叠,输出 0 。
Input
第 1 行:线段的数量 𝑁(2≤𝑁≤50000)。
第 2−𝑁+1 行:每行 2 个数,线段的起点和终点。 (0≤𝑠,𝑒≤109)
Output
输出最长重复区间的长度。
Sample 1
Inputcopy | Outputcopy |
---|---|
5 1 5 2 4 2 8 3 7 7 9 | 4 |
m 记录当前线段前面所有线段中终点最靠右的那根的右端点
首先现将所有线段按照左端点升序排列,如果当前线段的右端点大于等于m,则覆盖的区间为m减去当前线段的左端点,否则当前线段被完全覆盖,覆盖区间为当前线段的右端点减去当前线段的左端点
AC代码:
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=50010;
struct line
{
int st;
int ed;
}a[N];
bool cmp(line x,line y)
{
return x.st<y.st;
}
int maxlength;
int main()
{
int n; cin>>n;
for(int i=1;i<=n;i++) cin>>a[i].st>>a[i].ed;
sort(a+1,a+1+n,cmp);
int m=a[1].ed;
for(int i=2;i<=n;i++)
{
if(a[i].ed>=m)
{
maxlength=max(maxlength,m-a[i].st);
m=a[i].ed;
}
else
{
maxlength=max(maxlength,a[i].ed-a[i].st);
}
}
cout<<maxlength<<endl;
return 0;
}