제출 #1193123

#제출 시각아이디문제언어결과실행 시간메모리
1193123loomFeast (NOI19_feast)C++20
100 / 100
277 ms21528 KiB
#include<bits/stdc++.h>
#define int long long
#define nl endl
using namespace std;

signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(NULL);cout.tie(NULL);

    int n, k;
    cin>>n>>k;
    int a[n];
    for(int i=0; i<n; i++) cin>>a[i];

    set<pair<int,int> > idx;
    set<pair<pair<int,int>, int> > main;
    int sum = a[0];
    for(int i=1; i<n; i++){
        if(a[i] == 0) continue;
        if((a[i] >= 0 and a[i-1] >= 0) or (a[i] <= 0 and a[i-1] <= 0)){
            sum += a[i];
        }else{
            idx.insert(make_pair(i, sum));
            sum = a[i];
        }
    }
    idx.insert(make_pair(n, sum));

    if((*idx.begin()).second < 0) idx.erase(idx.begin());
    if(idx.size() > 1 and (*prev(idx.end())).second < 0) idx.erase(prev(idx.end()));

    for(auto x : idx){
        main.insert(make_pair(make_pair(abs(x.second), (x.second > 0)), x.first));
    }

    while((main.size()+1)/2 > k){
        int x = (*main.begin()).first.first * ((*main.begin()).first.second ? 1 : -1), i = (*main.begin()).second;
        auto it = idx.find(make_pair(i, x));

        pair<int,int> l = make_pair(0,0), r = make_pair(0,0);
        if(it != idx.begin()) l = *prev(it);
        if(next(it) != idx.end()) r = *next(it);

        main.erase(main.begin());
        main.erase(make_pair(make_pair(abs(l.second), (l.second > 0)), l.first));
        main.erase(make_pair(make_pair(abs(r.second), (r.second > 0)), r.first));
        main.insert(make_pair(make_pair(abs(x + l.second + r.second), (x + l.second + r.second > 0)), i));

        if(it != idx.begin()) idx.erase(prev(it));
        if(next(it) != idx.end()) idx.erase(next(it));
        idx.erase(it);
        idx.insert(make_pair(i, x + l.second + r.second));

        auto rem = idx.find(make_pair(i, x + l.second + r.second));
        if((rem == idx.begin() or next(rem) == idx.end()) and x > 0){
            main.erase(make_pair(make_pair(abs(x + l.second + r.second), (x + l.second + r.second > 0)), i));
            idx.erase(rem);
        }
    }

    sum = 0;
    for(auto x : main){
        if(x.first.second) sum += x.first.first;
    }

    cout<<sum;
    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...