Submission #1241816

#TimeUsernameProblemLanguageResultExecution timeMemory
1241816FaggiBoxes with souvenirs (IOI15_boxes)C++20
50 / 100
46 ms20004 KiB
#include <bits/stdc++.h>
#define ll long long
#define sz(x) int(x.size())
#define fr first
#define se second
#define all(x) x.begin(),x.end()
#define pb push_back
using namespace std;



long long delivery(int N, int K, int L, int p[])
{
    vector<ll>der,iz,agIz,agDer;
    ll sobIz=0, sobDer=0, ant;
    ll cost=0,i, sob=0;
    for(i=0; i<N; i++)
    {
        if(p[i]<(L+1)/2)
        {
            iz.pb(p[i]);
        }
        else
        {
            der.pb(p[i]);
        }
    }
    reverse(all(iz));
    while(sz(iz)&&iz.back()==0)
        iz.pop_back();
    agIz.resize(sz(iz),0);
    agDer.resize(sz(der),0);
    sort(all(iz));
    sort(all(der));
    for(i=0; i<sz(iz); i++)
    {
        if(sob==0)
        {
            agIz[i]=iz[i]*2ll;
            cost+=iz[i];
            sob=K-1;
        }
        else
        {
            cost+=iz[i]-iz[i-1];
            agIz[i]=(iz[i]-iz[i-1])*2ll;
            sob--;
        }
        if(sob==0)
        {
            cost+=iz[i];
        }
        else if(i+1==sz(iz))
        {
            cost+=iz[i];
        }
    }
    sobIz=sob;
    reverse(all(der));
    sob=0;
    for(i=0; i<sz(der); i++)
    {
        if(sob==0)
        {
            agDer[i]=(L-der[i])*2ll;
            cost+=(L-der[i]);
            sob=K-1;
        }
        else
        {
            agDer[i]=((L-der[i])-(L-der[i-1]))*2ll;
            cost+=abs((L-der[i])-(L-der[i-1]));
            sob--;
        }
        if(sob==0)
        {
            cost+=(L-der[i]);
        }
        else if(i+1==sz(der))
        {
            cost+=(L-der[i]);
        }
    }
    sobDer=sob;
    ll mi=cost,au=cost;
    if(sobIz>0)
    {
        cost-=iz.back();
        ant=iz.back();
        for(i=sz(der)-1; i>=0; i--)
        {
            cost-=agDer[i];
            cost+=abs(ant-der[i]);
            ant=der[i];
            sobIz--;
            if(sobIz==0||i-1<0)
            {
                cost+=(L-der[i]);
                break;
            }
        }
        mi=min(mi,cost);
    }
    cost=au;

    if(sobDer>0&&sz(iz))
    {
        cost-=(L-der.back());
        ant=der.back();
        for(i=sz(iz)-1; i>=0; i--)
        {
            cost-=agIz[i];
            cost+=abs(ant-iz[i]);
            ant=iz[i];
            sobDer--;
            if(sobDer==0||i-1<0)
            {
                cost+=iz[i];
                break;
            }
        }
        mi=min(mi,cost);
    }
    cost=0;
    sob=0;
    for(i=sz(der)-1; i>=0; i--)
    {
        if(sob==0)
        {
            cost+=(L-der[i])*2ll;
            sob=K-1;
        }
        else
        {
            sob--;
        }
    }
    sob=0;
    for(i=sz(iz)-1; i>=0; i--)
    {
        if(sob==0)
        {
            cost+=iz[i]*2ll;
            sob=K-1;
        }
        else
        {
            sob--;
        }
    }
    mi=min(cost,mi);



    //IZ
    cost=0, sob=0, ant=0;
    for(i=0; i<sz(iz); i++)
    {
        if(sob==0)
        {
            cost+=iz[i];
            sob=K-1;
        }
        else
        {
            cost+=abs(ant-iz[i]);
            sob--;
        }
        if(sob==0)
        {
            cost+=iz[i];
        }
        ant=iz[i];
    }
    if(sob>0&&sz(der))
    {
        ll ult=sz(der)-1;
        for(i=sz(der)-1; i>=0; i--)
        {
            sob--;
            ult=i;
            cost+=abs(der[i]-ant);
            if(sob==0||i-1==0)
            {
                cost+=(L-der[i]);
                break;
            }
            ant=der[i];
        }
        sob=0;
        ant=0;

        for(i=ult-1; i>=0; i--)
        {
            if(sob==0)
            {
                sob=K-1;
                cost+=(L-der[i])*2ll;
            }
            else
            {
                sob--;
            }
        }
        mi=min(cost,mi);
    }




    //DER
    cost=0, sob=0, ant=0;
    for(i=0; i<sz(der); i++)
    {
        if(sob==0)
        {
            cost+=(L-der[i]);
            sob=K-1;
        }
        else
        {
            cost+=abs(ant-der[i]);
            sob--;
        }
        if(sob==0)
        {
            cost+=(L-der[i]);
        }
        ant=der[i];
    }
    if(sob>0&&sz(iz))
    {
        ll ult=sz(iz)-1;
        for(i=sz(iz)-1; i>=0; i--)
        {
            sob--;
            ult=i;
            cost+=abs(iz[i]-ant);
            if(sob==0||i-1==0)
            {
                cost+=iz[i];
                break;
            }
            ant=iz[i];
        }
        sob=0;
        ant=0;

        for(i=ult-1; i>=0; i--)
        {
            if(sob==0)
            {
                sob=K-1;
                cost+=iz[i]*2ll;
            }
            else
            {
                sob--;
            }
        }
        mi=min(cost,mi);
    }



    return mi;
}
#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...