Submission #1214998

#TimeUsernameProblemLanguageResultExecution timeMemory
1214998long290429Feast (NOI19_feast)C++20
100 / 100
133 ms12172 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

const int MAXN = 300000;
int n;
ll k;
ll a[MAXN];

pair<ll,ll> test(ll lmb) {
    vector<array<pair<ll,ll>,2>> dp(n);
    dp[0][0] = {0, 0};
    dp[0][1] = {a[0] - lmb, 1};
    for (int i = 1; i < n; i++) {
        // đóng subarray tại i
        dp[i][0] = max(dp[i-1][0], dp[i-1][1]);
        // mở hoặc tiếp tục subarray
        auto op1 = make_pair(dp[i-1][0].first + a[i] - lmb, dp[i-1][0].second + 1);
        auto op2 = make_pair(dp[i-1][1].first + a[i],     dp[i-1][1].second);
        dp[i][1] = max(op1, op2);
    }
    return max(dp[n-1][0], dp[n-1][1]);
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> n >> k;
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }

    ll lo = 0, hi = 1e18;
    while (lo < hi) {
        ll mid = lo + (hi - lo + 1) / 2;
        if (test(mid).second >= k) lo = mid;
        else hi = mid - 1;
    }

    auto res = test(lo);
    // res.first đã trừ penalty lo mỗi subarray,
    // nên cộng lại lo*k để được tổng thật
    cout << (res.first + lo * k) << "\n";
    return 0;
}
#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...