【题目】
【题解】
题意:给定n个区间,要求删去一个区间使得剩余区间的公共区间的右端点与左端点之差最大。
思路:运用贪心的思想。先将所有区间按左端点升序排序,使得后边的处理只需要考虑当前的x即可;用minn记录公共区间的最小右端点的最大值即队列的首部,声明一个递增的优先队列存前n-2个区间的右端点,便于minn的更新。最后处理最后两个区间,求出最大公共区间长度并更新ans与minn即可。
【代码】
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <stack>
#include <queue>
#include <algorithm>
#include <iostream>
#define mem(a) memset(a,0,sizeof(a))
#define go(i,a,b) for(int i=a;i<=b;i++)
#define og(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
const int maxn=1e5+5;
const int inf=0x3f3f3f3f;
typedef long long ll;
typedef unsigned long long ull;
struct p{
int x,y;
}f[3*maxn];
bool cmp(p l,p r){return l.x<r.x;}
main()
{
int n; scanf("%d",&n);
go(i,1,n) scanf("%d%d",&f[i].x,&f[i].y);
sort(f+1,f+n+1,cmp);
priority_queue<int, vector<int>, greater<int> > q;
while(!q.empty()) q.pop();
go(i,1,n-2) q.push(f[i].y);
int ans=0,minn;
if(n==2) minn=inf;
else minn=q.top();
go(i,n-1,n)
{
ans=max(ans,min(minn,f[i].y)-f[i].x);
if(f[i].y>minn)
{
q.pop();
q.push(f[i].y);
minn=q.top();
}
}
cout<<ans<<endl;
}