Submission #715656

#TimeUsernameProblemLanguageResultExecution timeMemory
715656fatemetmhrCandies (JOI18_candies)C++17
100 / 100
387 ms22624 KiB
// ~ Be Name Khoda ~

#include <bits/stdc++.h>
//#pragma GCC optimize ("Ofast")
//#pragma GCC target("avx2")
//#pragma GCC optimize("unroll-loops,O3")

using namespace std;

typedef long long ll;

#define pb       push_back
#define mp       make_pair
#define all(x)   x.begin(), x.end()
#define fi       first
#define se       second

const int maxn  =  1e6   + 10;
const int maxn5 =  5e5   + 10;
const int maxnt =  1.2e6 + 10;
const int maxn3 =  1e3   + 10;
const int mod   =  1e9   +  7;
const ll  inf   =  1e18;

set <pair<ll, int>> seg, av;
ll a[maxn5], sum[maxn5], have[maxn5];
int pre[maxn5], l[maxn5], r[maxn5], nxt[maxn5];

inline int merge(int v){
    int u = nxt[v];
    int z = nxt[u];
    nxt[v] = z;
    if(z != -1)
        pre[z] = v;
    av.erase({-(sum[u] - 2 * have[u]), u});
    av.erase({-(sum[v] - 2 * have[v]), v});
    sum[v] += sum[u];
    have[v] += have[u];
    l[v] = min(l[v], l[u]);
    r[v] = max(r[v], r[u]);
    return v;
}

int main()
{
    ios_base::sync_with_stdio(false); cin.tie(0);

    int n; cin >> n;
    for(int i = 0; i < n; i++){
        cin >> sum[i];
        av.insert({-sum[i], i});
        l[i] = r[i] = i;
        pre[i] = i - 1;
        nxt[i] = i + 1;
    }
    nxt[n - 1] = -1;
    ll cur = 0;
    for(int i = 1; i <= (n + 1) / 2; i++){
        int v = av.begin()->se;
        av.erase(av.begin());
        cur += sum[v] - 2 * have[v];
        have[v] = sum[v] - have[v];
        if(nxt[v] != -1)
            v = merge(v);
        if(pre[v] != -1)
            v = merge(pre[v]);
        if((r[v] - l[v] + 1) & 1)
            av.insert({-(sum[v] - 2 * have[v]), v});
        cout << cur << '\n';
    }
}

/*
5
3 5 1 7 6
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...