제출 #1316517

#제출 시각아이디문제언어결과실행 시간메모리
1316517Lakshya108Feast (NOI19_feast)C++20
100 / 100
105 ms5076 KiB
#include <bits/stdc++.h>
using namespace std;

pair<long long,int> calc(const vector<long long>& a, long long p) {
    int n = a.size();
    vector<long long> pref(n+1);
    for (int i = 0; i < n; i++) pref[i+1] = pref[i] + a[i];

    long long dp = 0, best = 0;
    int cnt = 0, bestc = 0;

    for (int i = 1; i <= n; i++) {
        long long v1 = dp;
        int c1 = cnt;

        long long v2 = best + pref[i] - p;
        int c2 = bestc + 1;

        if (v2 > v1 || (v2 == v1 && c2 > c1)) {
            dp = v2;
            cnt = c2;
        }

        long long cur = dp - pref[i];
        if (cur > best || (cur == best && cnt > bestc)) {
            best = cur;
            bestc = cnt;
        }
    }
    return {dp, cnt};
}

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

    int n, k;
    cin >> n >> k;
    vector<long long> a(n);
    for (auto &x : a) cin >> x;

    auto base = calc(a, 0);
    if (base.second <= k) {
        cout << base.first;
        return 0;
    }

    long long l = 1, r = 1e14;
    while (l <= r) {
        long long m = (l + r) >> 1;
        if (calc(a, m).second > k) l = m + 1;
        else r = m - 1;
    }

    auto res = calc(a, l);
    cout << res.first + l * res.second;
}
#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...