Submission #1357522

#TimeUsernameProblemLanguageResultExecution timeMemory
1357522Born_To_LaughFeast (NOI19_feast)C++17
12 / 100
38 ms12288 KiB
// Born_To_Laugh - Hughie Do
#include <bits/stdc++.h>
#define alle(AC) AC.begin(), AC.end()
#define fi first
#define se second
using namespace std;
typedef long long ll;
[[maybe_unused]] const ll MOD = 998244353, INF = 3e18 + 7;
const int maxn = 3e5 + 10;
int n, k;
ll a[maxn], val[maxn], lo[maxn], hi[maxn], dead[maxn];
void solve(){
    cin >> n >> k;
    for(int i=1; i<=n; ++i) cin >> a[i];

    vector<ll> ranges;
    for(int i=1; i<=n; ++i){
        if(!a[i]) continue;
        if(ranges.empty()){
            ranges.push_back(a[i]);
        }
        else{
            if((ranges.back() > 0 && a[i] > 0) || (ranges.back() < 0 && a[i] < 0)){
                ranges.back() += a[i];
            }
            else{
                ranges.push_back(a[i]);
            }
        }
    }

    int st = 0;
    while (st < ranges.size() && ranges[st] <= 0) st++;
    int en = (int)ranges.size() - 1;
    while (en >= 0 && ranges[en] <= 0) en--;

    if (st > en) {
        cout << 0 << "\n";
        return;
    }

    vector<ll> temp;
    int m = 0;
    ll sum = 0;
    
    for (int i = st; i <= en; i++) {
        temp.push_back(ranges[i]);
        if (ranges[i] > 0) {
            m++;
            sum += ranges[i];
        }
    }
    if (m <= k) {
        cout << sum << "\n";
        return;
    }
    
    int sz = temp.size();
    val[0] = INF; val[sz + 1] = INF;
    lo[0] = 0; lo[sz + 1] = sz;
    hi[0] = 1; hi[sz + 1] = sz + 1;

    priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<pair<ll, int>>> pq;
    for(int i=1; i<=sz; ++i){
        val[i] = abs(temp[i - 1]);
        lo[i] = i - 1;
        hi[i] = i + 1;
        pq.push({val[i], i});
    }

    for(int i=1; i<=m - k; ++i){
        if(pq.empty()) break;

        auto[v, id] = pq.top();
        pq.pop();
        if(dead[id]) continue;

        sum -= v;
        int l = lo[id];
        int r = hi[id];

        val[id] = val[l] + val[r] - val[id];
        dead[l] = 1;
        dead[r] = 1;
        lo[id] = lo[l];
        hi[id] = hi[r];
        hi[lo[id]] = id;
        lo[hi[id]] = id;
        
        pq.push({val[id], id});
    }
    cout << sum << "\n";
}
signed main(){
    // freopen("inp.txt", "r", stdin);
    // freopen("out.txt", "w", stdout);
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    solve();
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...