牛客多校2 G League of Legends

在这里插入图片描述

#include<iostream>
#include<cstring>
#include<algorithm>
#include<map>
#include<vector>

using namespace std;

const int N = 5e3 + 10;
int n,k;
struct node{
    
    
    int l,r;
    bool operator < (const node &p)const{
    
    
        if(l == p.l) return r > p.r;
        return l < p.l;
    }
}a[N],b[N];

int seg[N];

int dp[N][N]; //前i个数用了j个片段

int q[N][N],tail[N],head[N];

int main(){
    
    
    cin >> n >> k;
    for(int i = 1; i <= n; i++){
    
    
        cin >> a[i].l >> a[i].r;
    }

    sort(a + 1,a + n + 1);

    int cnt = 0,tot = 1;
    int maxr = 0x3f3f3f3f;
    for(int i = n; i >= 1; i--){
    
    
        if(maxr <= a[i].r){
    
    
            seg[++tot] = a[i].r - a[i].l;
        }else{
    
    
            //cout << a[i].l << " " <<a[i].r <<endl;
            b[++cnt] = a[i];
            maxr = a[i].r;
        }
    }
    memset(dp,-0x3f,sizeof dp);
    sort(b + 1,b + cnt + 1);
    sort(seg + 1,seg + tot + 1,greater<int>());
//1 3 4 6
    dp[0][0] = 0;
    for(int i = 1; i <= k; i++) tail[i] = -1;
    for(int i = 1; i <= cnt; i++){
    
    
        //for(int j = 0; j <= i - 1; j++){
    
    
            for(int l = k; l >= 1; l--){
    
    
                while(dp[q[l][tail[l]] - 1][l - 1] + b[q[l][tail[l]]].r < dp[i - 1][l - 1] + b[i].r && tail[l] >= head[l]) --tail[l];
                q[l][++tail[l]] = i;
                /*if(b[i].l < b[j + 1].r){
                    dp[i][l] = max(dp[i][l],dp[j][l - 1] + b[j + 1].r - b[i].l);
                }*/
                while(b[q[l][head[l]]].r <= b[i].l && head[l] <= tail[l]){
    
    
                    ++head[l];
                }
                //cout << i << " " << l << " " << q[l][head[l]] << endl;
                dp[i][l] = max(dp[i][l],dp[q[l][head[l]] - 1][l - 1] + b[q[l][head[l]]].r - b[i].l);
            }
        //}
    }

    int sum = 0;
    int maxn = dp[cnt][k];
    for(int i = 1; i <= tot && i <= k; i++){
    
    
        sum += seg[i];
        maxn = max(maxn,sum + dp[cnt][k - i]);
    }

    if(maxn > 0)
    cout << maxn << endl;
    else cout << 0 << endl;


    return 0;
}

猜你喜欢

转载自blog.csdn.net/qqqingyi/article/details/119222487
今日推荐