Submission #1247702

#TimeUsernameProblemLanguageResultExecution timeMemory
1247702TheSahibFeast (NOI19_feast)C++20
100 / 100
115 ms12168 KiB
// #pragma GCC optimize("O3")
// #pragma GCC target("avx2")
#include <bits/stdc++.h>

#define ll long long
#define int ll
#define pii pair<int, int>
#define all(v) v.begin(), v.end()
using namespace std;

const int inf = 1e18 + 9;
const int MAX = 2e5 + 5;
const int LOG = 20;
const int MOD = 998244353;

void solve(){
    int n, k; cin >> n >> k;
    int arr[n + 1];
    for(int i = 1; i <= n; ++i){
        cin >> arr[i];
    }

    auto get = [&](int pen){
        array<int, 2> dp[n + 1][2];
        dp[1][0] = {0, 0};
        dp[1][1] = {arr[1] - pen, 1};
        for(int i = 2; i <= n; ++i){
            dp[i][0] = max(dp[i - 1][0], dp[i - 1][1]);
            dp[i][1] = max((array<int, 2>){dp[i - 1][1][0] + arr[i], dp[i - 1][1][1]}, 
                           (array<int, 2>){dp[i - 1][0][0] - pen + arr[i], dp[i - 1][0][1] + 1});
        }
        array<int, 2> mx = max(dp[n][0], dp[n][1]);
        return mx;
    };

    int l = 0, r = 3e14 + 100;
    while(l < r){
        int mid = (l + r + 1) / 2;
        auto mx = get(mid);
        if(mx[1] >= k){
            l = mid;
        }
        else{
            r = mid - 1;
        }
    }
    auto a = get(l);
    cout << a[0] + k * l << '\n';
}

signed main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int t = 1; 
    // cin >> t;
    while(t){
        t--;
        solve();
    }
}
#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...