Submission #1362307

#TimeUsernameProblemLanguageResultExecution timeMemory
1362307nguyenkhangninh99Feast (NOI19_feast)C++20
22 / 100
224 ms22532 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef long long ll;
typedef long double ld;
typedef vector<int> vi;
typedef vector<ll> vll;
#define FOR(i, a) for (int i=0; i<(a); i++)
#define all(x) x.begin(), x.end()
#define gcd __gcd
#define pll pair<ll, ll>
#define pii pair<int, int>
#define fi first
#define se second
//const int dr[4] = {-1, 0, 1, 0}, dc[4] = {0, 1, 0, -1};

const int N = 3e5 + 5;
int a[N], pre[N], nxt[N];

signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n, k; cin >> n >> k;
    multiset<int> s;
    multiset<pii> t;
    int pos = 0, sum = 0;

    auto add = [&](int id) -> void {
        if(a[id] > 0){
            ++pos;
            sum += a[id];
        }
        s.insert(a[id]);
        t.insert({abs(a[id]), id});
    };

    auto del = [&](int id) -> void {
        if(a[id] > 0){
            --pos;
            sum -= a[id];
        }
        s.erase(s.find(a[id]));
        t.erase({abs(a[id]), id});
    };

    for(int i = 1; i <= n; ++i)
        cin >> a[i];
    vi v;
    int sss = 0;
    for(int i = 1; i <= n; ++i){
        if(a[i] >= 0 && a[i - 1] >= 0){
            sss += a[i];
        }
        else if(a[i] <= 0 && a[i - 1] <= 0){
            sss += a[i];
        }
        else{
            v.push_back(sss);
            sss = a[i];
        }
    }
    v.push_back(sss);
    n = v.size();
    for(int i = 1; i <= n; ++i){
        a[i] = v[i - 1];
        pre[i] = i - 1;
        nxt[i] = i + 1;
        add(i);
    }

    int ans = 0;
    if(pos <= k) ans = sum;
    while(s.size() > 1){
        int id = (*t.begin()).se;
        del(id);
        a[id] += a[pre[id]] + a[nxt[id]];
        add(id);
        int l = pre[id], r = nxt[id];
        if(pre[id] != 0){
            del(pre[id]);
            l = pre[pre[id]];
        }
        if(nxt[id] != n + 1){
            del(nxt[id]);
            r = nxt[nxt[id]];
        }
        pre[id] = l; nxt[l] = id;
        pre[r] = id; nxt[id] = r;
        if(pos <= k) ans = max(ans, sum);
    }
    cout << ans;
    return 0;
}
#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...