Submission #1185734

#TimeUsernameProblemLanguageResultExecution timeMemory
1185734vivkostov선물상자 (IOI15_boxes)C++20
35 / 100
0 ms328 KiB
//#pragma once
//#include "grader.cpp"
#include "boxes.h"
#include "bits/stdc++.h"
using namespace std;
long long int n,k,m,a[10000005],l,r,used[10000005],st[10000005],mi,start,brl,brr;
void prec()
{
    for(int i=1; i<=n; i++)
    {
        st[i]=min(a[i]*2,(m-a[i])*2);
        if(!start&&a[i]!=0)start=i;
        if(a[i]<=l&&a[i]!=0)brl++;
        else brr++;
    }
    if(!start)start=n+1;
}
long long int go_from_left()
{
    int num=0;
    long long int otg=0;
    for(int i=start; i<=n; i++)
    {
        num++;
        if(num==k||i==n)
        {
            if(a[i]<=l)otg+=st[i];
            else if(a[i-num+1]<=l)otg+=m;
            else otg+=st[i-num+1];
            num=0;
        }
    }
    return otg;
}
long long int go_from_right()
{
    int num=0;
    long long int otg=0;
    for(int i=n; i>=start; i--)
    {
        num++;
        if(num==k||i==start)
        {
            if(a[i]>=r)otg+=st[i];
            else if(a[i+num-1]>=r)otg+=m;
            else otg+=st[i+num-1];
            num=0;
        }
    }
    return otg;
}
long long int go_from_mid()
{
    int num=0;
    long long int otg=st[start+(brl%k)-1];
    if(brl>=k)
    {
        for(int i=start+(brl%k); i<=n; i++)
        {
            if(a[i]<=l)num++;
            if(num==k||a[i]>l||i==n)
            {
                if(a[i]>l)i--;
                otg+=st[i];
                num=0;
                if(a[i+1]>l)break;
            }
        }
    }
    otg+=st[n-(brr%k)+1];
    if(brr>=k)
    {
        for(int i=n-(brr%k); i>=start; i--)
        {
            if(a[i]>=r)num++;
            if(num==k||a[i]<r||i==start)
            {
                if(a[i]<r)i++;
                otg+=st[i];
                num=0;
                if(a[i-1]<r)break;
            }
        }
    }
    return otg;
}
long long int delivery(int N, int K, int L, int p[])
{
    n=N;
    k=K;
    m=L;
    for(int i=0; i<n; i++)
    {
        a[i+1]=p[i];
    }
    l=(m-1)/2;
    r=(m+1)/2;
    prec();
    mi=min(go_from_left(),go_from_right());
    mi=min(mi,go_from_mid());
    //cout<<mi<<endl;
    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...