20pts求修
查看原帖
20pts求修
755789
Misty_Post楼主2024/12/7 16:16
#include<bits/stdc++.h>
using namespace std;

#define ll long long
ll n, m, a[1000000], sum, ans, kp;
ll sg[1000000], xg[1000000];
ll vis[1000000];
priority_queue<pair<ll, ll>, vector<pair<ll, ll>>, greater<pair<ll, ll>>> q;

int main() {
    cin >> n >> m;
    ll op = 0;

    for (int i = 1; i <= n; i++) {
        sg[i] = i - 1;
        xg[i] = i + 1;
        ll k;
        cin >> k;

        if (k > 0) {
            if (op == 1) {
                a[sum] += k;
            } else {
                op = 1;
                a[++sum] = k;
            }
        } else {
            if (op == 0) {
                a[sum] += k;
            } else {
                op = 0;
                a[++sum] = k;
            }
        }
    }

    for (int i = 1; i <= sum; i++) {
        if (a[i] < 0) {
            q.push({abs(a[i]), -i});
        } else if(a[i]>0) {
            q.push({abs(a[i]), i});
        }

        if (a[i] > 0) {
            kp++;
            ans += a[i];
        }
    }

    ll summ = kp;

    if (kp <= m) {
        cout << ans;
    } else {
        while (true) {
            if (kp <= m || q.empty()) {
                cout << ans;
                return 0;
            }

            if (!vis[abs(q.top().second)]) {
                ll xx = abs(q.top().second);

                if (sg[xx] >= 1 && xg[xx] <= summ || q.top().second > 0) {
                    ans -= abs(a[xx]);
                    a[xx] += a[sg[xx]] + a[xg[xx]];

                    vis[sg[xx]] = vis[xg[xx]] = 1;

                    sg[xg[xx]] = sg[sg[xx]];
                    xg[sg[xx]] = xg[xx];
                    sg[xg[xx]] = sg[sg[xx]];
                    xg[sg[sg[xx]]] = xg[xx];

                    q.push({a[xx], xx});
                    kp--;
                }
            }
            q.pop();
        }
        cout << ans;
    }

    return 0;
}

2024/12/7 16:16
加载中...