Submission #1313673

#TimeUsernameProblemLanguageResultExecution timeMemory
1313673spicytomatoFeast (NOI19_feast)C++20
4 / 100
44 ms19364 KiB
#include <bits/stdc++.h>

using namespace std;

long long n,k,x,ans=0,cnt=0,f=1,lnei[600001]={0},rnei[600001]={0},l[600001]={0},r[600001]={0},vld[600001]={0},sum[600001]={0};
vector<long long> a,val;
priority_queue<pair<long long,int> > q;

void solve() 
{
    a.push_back(0);
    val.push_back(0);
    cin>>n>>k;
    for(int i=1;i<=n;i+=1) 
    {
        cin>>x;
        if(x!=0) a.push_back(x);
    }
    n=a.size()-1;
    k=min(k,n);
    int ind=1;
    while(ind<a.size() && a[ind]<0) ind+=1;
    if(ind==a.size()) 
    {
        cout<<0;
        return;
    }
    long long pre=0;
    for(int i=ind;i<=n;i+=1)
    {
        if(f*a[i]>0) pre+=a[i];
        else
        {
            if(pre>0) 
            {
                ans+=pre;
                cnt+=1;
            }
            val.push_back(pre);
            pre=a[i];
            f=-f;
        }
    }
    if(pre>0)
    {
        ans+=pre;
        cnt+=1;
    }
    val.push_back(pre);
    //for(int i=1;i<val.size();i+=1) cout<<val[i]<<" ";
    if(cnt<=k)
    {
        cout<<ans;
        return;
    }
    int tot=val.size()-1;
    for(int i=1;i<=tot;i+=1) sum[i]=val[i]+sum[i-1];
    for(int i=1;i<=tot;i+=1)
    {
        l[i]=r[i]=i;
        lnei[i]=i-1;
        rnei[i]=(i+1)%(tot+1);
        vld[i]=1;
        q.push(make_pair(-abs(a[i]),i));
    }
    while(cnt>k)
    {
        long long d=q.top().first;
        int id=q.top().second;
        q.pop();
        if(vld[id]==0) continue;
        ans+=d;
        vld[id]=0;
        if(vld[l[id]]==1 && vld[r[id]]==1) cnt-=1;
        tot+=1;
        vld[tot]=1;
        lnei[tot]=lnei[lnei[id]];
        rnei[tot]=rnei[rnei[id]];
        l[tot]=vld[lnei[tot]]==1 ? l[lnei[tot]] : lnei[id];
        l[tot]=vld[rnei[tot]]==1 ? r[lnei[tot]] : rnei[id];
        if(vld[lnei[tot]]) rnei[lnei[tot]]=tot;
        if(vld[rnei[tot]]) lnei[rnei[tot]]=tot;
        vld[rnei[id]]=vld[lnei[id]]=0;
        if(val[l[tot]]<0) q.push(make_pair(sum[r[tot]]-sum[l[tot]-1],tot));
        else q.push(make_pair(-sum[r[tot]]+sum[l[tot]-1],tot));
        cnt-=1;
    }
    cout<<ans;
}  

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int t=1;
    //cin>>t;
    while(t--) solve();
    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...