Submission #1190745

#TimeUsernameProblemLanguageResultExecution timeMemory
1190745AlgorithmWarriorCandies (JOI18_candies)C++20
0 / 100
2 ms580 KiB
#include <bits/stdc++.h>

using namespace std;

long long const INF=1e18;
int const MAX=200005;
long long sppar[MAX],spimp[MAX];
int n;
long long v[MAX];
int cst[MAX],cdr[MAX];
long long val[MAX];
class cmp{
public:
    bool operator()(int a,int b)const{
        return val[a]>val[b];
    }
};
set<int,cmp>s;

void read(){
    cin>>n;
    int i;
    for(i=1;i<=n;++i)
        cin>>v[i];
    v[0]=-INF;
    v[n+1]=-INF;
}

void precalc(){
    sppar[0]=v[0];
    sppar[1]=v[0];
    spimp[0]=0;
    spimp[1]=v[1];
    int i;
    for(i=2;i<=n+1;++i)
        if(i&1){
            spimp[i]=spimp[i-1]+v[i];
            sppar[i]=sppar[i-1];
        }
        else{
            spimp[i]=spimp[i-1];
            sppar[i]=sppar[i-1]+v[i];
        }
}

void init(){
    int i;
    for(i=0;i<=n+1;++i){
        cst[i]=i;
        cdr[i]=i;
        val[i]=v[i];
        s.insert(i);
    }
}

long long sp(int l,int r,long long sump[]){
    long long ans=sump[r];
    if(l>0)
        ans-=sump[l-1];
    return ans;
}

void solve(){
    long long ans=0;
    int i;
    for(i=1;i<=(n+1)/2;++i){
        int id=*s.begin();
        ans+=val[id];
        cout<<ans<<'\n';
        s.erase(id);
        int l=cst[id-1];
        int r=cdr[cdr[id]+1];
        s.erase(l);
        s.erase(cst[r]);
        cdr[l]=r;
        cst[r]=l;
        if(l&1)
            val[l]=sp(l,r,spimp)-sp(l,r,sppar);
        else
            val[l]=sp(l,r,sppar)-sp(l,r,spimp);
        s.insert(l);
    }
}

int main()
{
    read();
    precalc();
    init();
    solve();
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...