#include<cstdio>
#include<algorithm>
using namespace std;
const int MAX = 3e5 + 5;
struct _N
{
int l, r;
} a[MAX], b[MAX];
bool cmp1(_N x, _N y)
{
if(x.l != y.l)
{
return x.l < y.l;
}
else
{
return x.r > y.r;
}
}
bool cmp2(_N x, _N y)
{
if(x.r != y.r)
{
return x.r < y.r;
}
else
{
return x.l < y.l;
}
}
int main()
{
int n, t1, t2, ans, temp;
while(~scanf("%d", &n))
{
for(int i = 0; i < n; i++)
{
scanf("%d%d", &t1, &t2);
a[i].l = b[i].l = t1;
a[i].r = b[i].r = t2;
}
sort(a, a + n, cmp1);
sort(b, b + n, cmp2);
if(b[0].r != a[n - 1].r)
{
ans = b[0].r - a[n - 2].l;
}
else
{
ans = b[1].r - a[n - 2].l;
}
if(b[0].l != a[n - 1].l)
{
temp = b[1].r - a[n - 1].l;
}
else
{
temp = b[1].r - a[n - 2].l;
}
if(ans < temp)
{
ans = temp;
}
if(ans < 0)
ans = 0;
printf("%d\n", ans);
}
return 0;
}
题意:给定n个区间,去掉一个区间使得剩下的n-1个区间相交的部分值最大,输出最大值
思路:去掉的那个区间必然是区间左值最大的(记为A)或者区间右值最小的(记为B)(可能存在一个左值最大右值最小的区间),试着分别去掉A、B,比较结果大小。