Submission #1346714

#TimeUsernameProblemLanguageResultExecution timeMemory
1346714bbartekCandies (JOI18_candies)C++20
100 / 100
61 ms10872 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
#define st first
#define nd second
#define pb push_back
#define pii pair<int,int>
#define pll pair<ll,ll>

const int maxn = 2e5+7;

int tab[maxn];
int lewy[maxn];
int prawy[maxn];
int nr[maxn];
ll val[maxn];
ll wyn[maxn];
bool usuniete[maxn];

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

    priority_queue<pll> Q;
    for(int i=1;i<=n;i++){
        cin>>tab[i];
        lewy[i] = i;
        prawy[i] = i;
        nr[i] = i;
        val[i] = tab[i];
        Q.push({val[i],i});
    }

    for(int i=1;i<=(n+1)/2;i++){
        auto [x,ind] = Q.top();
        Q.pop();
        if(usuniete[ind]){
            i--;
            continue;
        }
        //cout<<ind<<" "<<x<<"\n";
        wyn[i] = wyn[i-1] + val[ind];
        val[ind] = -val[ind];
        int s;
        s = nr[lewy[ind]-1];
        if(lewy[ind] == 1 || usuniete[s]){
            usuniete[ind] = 1;
        }
        else{
            val[ind] += val[s];
            lewy[ind] = lewy[s];
            nr[lewy[ind]] =  ind;
        }
        usuniete[s] = 1;

        s = nr[prawy[ind]+1];
        if(prawy[ind] == n || usuniete[s]){
            usuniete[ind] = 1;
        }
        else{
            val[ind] += val[s];
            prawy[ind] = prawy[s];
            nr[prawy[ind]] = ind;
        }
        usuniete[s] = 1;

        //cout<<ind<<" "<<lewy[ind]<<" "<<prawy[ind]<<" "<<val[ind]<<"\n"; 
        if(!usuniete[ind]){
            Q.push({val[ind],ind});
        }
    }

    for(int i=1;i<=(n+1)/2;i++){
        cout<<wyn[i]<<"\n";
    }
    
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...