Submission #1296391

#TimeUsernameProblemLanguageResultExecution timeMemory
1296391chaitanyamehtaFeast (NOI19_feast)C++20
30 / 100
131 ms2752 KiB
#include<bits/stdc++.h>
using namespace std;

#define int long long
int n , k;
const int INF = 1e15;
vector<int> a;

pair<int , int> better(pair<int , int> opt1 , pair<int , int> opt2){
    if(opt1.first != opt2.first){
        return (opt1.first > opt2.first) ? opt1 : opt2;
    }
    else{
        return (opt1.second >= opt2.second) ? opt1 : opt2;
    }
}

pair<int , int> check(int lambda){
    pair<int , int> dp1 = {-INF , 0}, dp0 = {0 , 0};

    for(int i = 0 ; i < n ; i++){
        pair<int , int> opt1 = {(dp1.first == -INF) ? -INF :   dp1.first + a[i] , dp1.second};
        pair<int , int> opt2 = {dp0.first + a[i] - lambda , dp0.second + 1};
    
        dp1 = better(opt1 , opt2);
        dp0 = better(dp1 , dp0);
    }
    return dp0;
}

int solve(){
    int l = -1e15;
    int r = 1e15;
    int ans = 0;
    while(l < r){
        int m = l + ((r-l+1) / 2);
        if(check(m).second >= k){
            l = m;
            ans = m;
        }
        else{
            r = m -1;
        }
    }
    return l;
}


signed main(){
    cin>>n >> k;
    a.resize(n);
    for(int i = 0 ; i < n ;i++)cin>>a[i];

    int ans = solve();   

    pair<int , int> fans = check(ans);

    cout << max(0LL , fans.first + (ans * k));
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...