Submission #894617

#TimeUsernameProblemLanguageResultExecution timeMemory
894617IWKRFeast (NOI19_feast)C++17
100 / 100
76 ms25536 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long

int arr[300001];
int a[300001];
int s[300001];
int cost[300001];
int pre[300001];
int nex[300001];
bool mark[300001];
priority_queue<tuple<int, int, int>> pq;

int32_t main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    int n, k;
    cin >> n >> k;
    for (int i = 0; i < n; i++) {
        cin >> arr[i];
    }
    int start = 0;
    int end = n - 1;
    while (start < n && arr[start] <= 0) {
        start++;
    }
    while (end >= 0 && arr[end] <= 0) {
        end--;
    }
    if (start > end) {
        cout << 0;
        return 0;
    }
    n = 0;
    for (int i = start; i <= end; i++) {
        a[++n] = arr[i];
    }
    for (int i = 1; i <= n; i++) {
        s[i] = s[i - 1] + a[i];
    }
    int last = 0;
    pre[0] = nex[n] = 1e9;
    for (int i = 1; i <= n; i++) {
        if (i > 1 && (a[i] > 0) != (a[i - 1] > 0)) {
            if (a[i - 1] > 0) {
                --k;
            }
            cost[i - 1] = -abs(s[i - 1] - s[last]);
            pre[i - 1] = last;
            nex[last] = i - 1;
            pq.emplace(cost[i - 1], last, i - 1);
            last = i - 1;
        }
    }
    --k;
    cost[n] = -abs(s[n] - s[last]);
    pre[n] = last;
    nex[last] = n;
    pq.emplace(cost[n], last, n);
    int ans = 0;
    while (!pq.empty() && k < 0) {
        int price, l, r;
        tie(price, l, r) = pq.top();
        pq.pop();
        if (mark[l] || mark[r] || price != cost[r]) {
            continue;
        }
        ++k;
        ans += cost[r];
        mark[l] = mark[r] = true;
        int ll = pre[l];
        int rr = nex[r];
        if (ll < rr && ll >= 0 && rr <= n) {
            pre[rr] = ll;
            nex[ll] = rr;
            cost[rr] += cost[l] - cost[r];
            cost[r] = -1e18;
        }
        if (ll < rr && ll >= 0 && rr <= n && !mark[ll] && !mark[rr]) {
            pq.emplace(cost[rr], ll, rr);
        }
    }
    for (int i = 1; i <= n; i++) {
        if (a[i] > 0) {
            ans += a[i];
        }
    }
    cout << ans;
}
#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...