Submission #1150470

#TimeUsernameProblemLanguageResultExecution timeMemory
1150470brintonFeast (NOI19_feast)C++20
0 / 100
104 ms16572 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
struct Node{
    Node *p,*child;
    int val;
    Node(int ival): p(nullptr),child(nullptr),val(ival) {};
};
signed main(){
    cin.tie(0);
    ios_base::sync_with_stdio(0);
    //start here
    int N,K;cin >> N >> K;
    vector<int> v;
    int prev = 0;
    for(int i = 0;i < N;i++){
        int cur;cin >> cur;
        if(cur*prev < 0){
            if(!v.empty() || prev > 0){
                v.push_back(prev);
            }
            prev = cur;
        }else{
            prev += cur;
        }
    }
    v.push_back(prev);
    if(v.size() >= 1 && v.back() < 0)v.pop_back(); 
    // for(auto i:v)cout << i << " ";cout << endl;

    // greedy
    N = v.size();
    set<pair<int,Node*>> s;
    int ans = 0;
    int used = 0;
    vector<Node*> link;
    for(int i = 0;i < N;i++){
        link.push_back(new Node(v[i]));
        if(i != 0){
            link[i]->p = link[i-1];
            link[i-1]->child = link[i];
        }

        if(v[i] > 0){
            used++;
            ans += v[i];
        }
        s.insert({abs(v[i]),link[i]});
    }
    while(used > K){
        ans -= s.begin()->first;
        Node* cur = s.begin()->second;
        s.erase(s.begin());

        
        
        if(cur->p != nullptr){
            cur->val += cur->p->val;
            s.erase({abs(cur->p->val),cur->p});
            cur->p = cur->p->p;
            if(cur->p != nullptr)cur->p->child = cur;
        }
        
        if(cur->child != nullptr){
            cur->val+cur->child->val;
            s.erase({abs(cur->child->val),cur->p});
            cur->child = cur->child->child;
            if(cur->child != nullptr)cur->child->p = cur;
        }

        s.insert({cur->val,cur});
        used--;
    }
    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...