题目链接: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;
}