题目链接:https://codeforces.com/contest/1029/problem/C
题意:给你n条线段,问你删掉一个线段以后剩余的n-1条线段相交部分的最大值
思路:首先,n条线段相交部分是左边界的最大值,右边界的最小值之差。那么,这一题其实我们只要枚举n条线段,每删掉一条以后维护一下左边界的最大值和右边界的最小值,之后更新一下最大值就可以啦。但是直接n^2枚举的话肯定会超时的,而且线段还可能右一样的,所以我们可以用两个multiset维护左边界的最大值和右边界的最小值。
AC代码:
#include<iostream>
#include<cstdio>
#include<set>
using namespace std;
const int maxn=3e5+7;
multiset<int>sl,sr;
struct node
{
int l,r;
} a[maxn];
int main()
{
int n;
while(~scanf("%d",&n))
{
sl.clear(),sr.clear();
for(int i=1; i<=n; i++)
{
scanf("%d%d",&a[i].l,&a[i].r);
sl.insert(a[i].l),sr.insert(a[i].r);
}
int ans=0;
for(int i=1; i<=n; i++)
{
sl.erase(sl.find(a[i].l)),sr.erase(sr.find(a[i].r));
int templ=*sl.rbegin(),tempr=*sr.begin();
ans=max(ans,tempr-templ);
sl.insert(a[i].l),sr.insert(a[i].r);
}
printf("%d\n",ans);
}
return 0;
}