思路:枚举要解雇的人,计算它能减少的覆盖时间段,取个 min,然后用不解雇能覆盖的总时间 sum 减去它。
代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,ans=-1e10;
struct node{
int l,r;
}a[100031];
bool cmp(node x,node y){
if(x.l==y.l) return x.r<y.r;
return x.l<y.l;
}
signed main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i].l>>a[i].r;
sort(a+1,a+n+1,cmp);
int sum=0,l=a[1].l,r=a[1].r;
for(int i=1;i<n;i++){
if(a[i].r>=a[i+1].l) r=a[i+1].r;
else sum+=(r-l),l=a[i+1].l,r=a[i+1].r;
}
sum+=(r-l);
for(int i=1;i<=n;i++){
int k=a[i].r-a[i].l;
if(i>1&&a[i-1].r>=a[i].r){ ans=max(ans,sum); continue; }
if(i>1&&a[i-1].r>=a[i].l) k-=(a[i-1].r-a[i].l);
if(i<n&&a[i].r>=a[i+1].l) k-=(a[i].r-a[i+1].l);
ans=max(ans,sum-k);
}
cout<<ans;
return 0;
}