Cod sursa(job #2845657)

Utilizator marcumihaiMarcu Mihai marcumihai Data 8 februarie 2022 09:28:37
Problema Mins Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f ("stalpi2.in");
ofstream g ("stalpi2.out");

int n, energie;
int maxim=0;
int dp[50][200505];
int rmq[20][200005];
int a[100005];

void reinit(int ind)
{
    for(int i=0; i<=log2(maxim); ++i)
        for(int j=1; j<=maxim; ++j)
            rmq[i][j]=999999999;
    for(int i=1; i<=maxim; ++i)
        rmq[0][i]=dp[ind][i];

    for(int i=1; i<=log2(maxim); ++i)
    {
        for(int j=1; j<=maxim; ++j)
            rmq[i][j]=min(rmq[i-1][j], rmq[i-1][j+(1<<(i-1))]);
    }


}
inline int minim(int st, int dr)
{

    st=max(st, 0);
    int d=dr-st+1;
    int put=log2(d);
    if(st==dr)
        return rmq[0][st];
    return min(rmq[put][st], rmq[put][dr-(1<<(put))]);

}

inline int ok(int dist)
{
    for(int i=1; i<=n; ++i)
        for(int j=1; j<=maxim; ++j)
            dp[i][j]=999999999;



    dp[1][a[1]]=0;
    for(int i=2; i<n; ++i)
    {
        reinit(i-1);
        for(int j=a[1]; j<=a[n]; ++j)
        {

            dp[i][j]=minim(j-dist, j)+abs(j-a[i]);
        }
    }
    for(int j=a[n]; j>=a[n]-dist; --j)
        dp[n][a[n]]=min(dp[n][a[n]], dp[n-1][j]);

    ///cout<<dp[n][a[n]]<<"\n";
    if(dp[n][a[n]]<=energie)
        return 1;
    return 0;
}




int main()
{
    f>>n>>energie;
    a[1]=0;
    for(int i=2; i<=n; ++i)
    {
        f>>a[i];
        maxim=max(maxim, a[i]);

    }


    int st=1;
    int dr=a[n]-a[1];
    int mij=(st+dr)/2;
    int rez=0;



    while(st<=dr)
    {
        ///cout<<mij<<"\n";
        if(ok(mij))
        {
            dr=mij-1;
            rez=mij;

        }
        else
            st=mij+1;

        mij=(st+dr)/2;

    }
    g<<rez;
    return 0;
}