题目链接:http://codeforces.com/contest/1029/problem/C
题意是输入n个线段,可以任意删除一个线段,问删除一个线段后剩下的所有线段的交集最大是多少。
首先我们要知道对于n个线段的交集=最小的右端点-最大的左端点。如下图他们的交集就是r-l。那么当如果不存在所有的区间交点的话所得的值就是负的。对于这道题我们可以用multiset来写,对于set而言,multiset可以存重复的值,我们可以用两个multiset来分别存左端点和右端点,然后依次删除一个线段来更新交集的最大值就好了。
AC代码:
#include <bits/stdc++.h>
#define maxn 300005
using namespace std;
multiset<int> ls;
multiset<int> rs;
int l[maxn],r[maxn];
int n;
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d%d",&l[i],&r[i]);
ls.insert(l[i]);
rs.insert(r[i]);
}
int ans = 0;
for(int i=0;i<n;i++){
ls.erase(ls.find(l[i]));
rs.erase(rs.find(r[i]));
ans = max(ans, *rs.begin() - *ls.rbegin());
ls.insert(l[i]);
rs.insert(r[i]);
}
printf("%d\n",ans);
return 0;
}