제출 #1290465

#제출 시각아이디문제언어결과실행 시간메모리
1290465MinhKienFeast (NOI19_feast)C++20
22 / 100
52 ms7432 KiB
#include <iostream>

using namespace std;

#define ll long long

const int N = 3e5 + 10;

int n, k, MinPre, it[N], f[N];
ll a[N], dp[N];

void dodp(ll delta) {
    dp[1] = a[1] - delta;
    f[1] = 1;
    for (int i = 2; i <= n; ++i) {
        if (dp[it[i]] > 0) {
            dp[i] = dp[it[i]] + a[i] - a[it[i]] - delta;
            f[i] = f[it[i]] + 1;
        } else {
            dp[i] = a[i] - a[it[i]] - delta;
            f[i] = 1;
        }

        if (dp[i - 1] > dp[i]) {
            dp[i] = dp[i - 1];
            f[i] = f[i - 1];
        }
    }
}

int main() {
    cin.tie(0); cout.tie(0);
    ios_base::sync_with_stdio(false);

    cin >> n >> k;
    for (int i = 1; i <= n; ++i) {
        cin >> a[i];
        it[i] = MinPre;
        a[i] += a[i - 1];
        if (a[i] < a[MinPre]) MinPre = i;
    }

    ll l = 0, r = 1e12, ans = l;
    while (l <= r) {
        ll mid = (l + r) >> 1;

        dodp(mid);
        if (f[n] <= k) {
            r = mid - 1;
            ans = mid;
        } else {
            l = mid + 1;
        }
    }

    dodp(ans);
    cout << max(0ll, dp[n] + (ll)f[n] * ans) << "\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...