70pts 求调qwq
查看原帖
70pts 求调qwq
542221
KidA楼主2023/10/16 12:58

思路:枚举要解雇的人,计算它能减少的覆盖时间段,取个 min⁡\min,然后用不解雇能覆盖的总时间 sumsum 减去它。

代码:

#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;
} 
2023/10/16 12:58
加载中...