Pagini recente » Cod sursa (job #997990) | Cod sursa (job #398711) | Cod sursa (job #1044775) | Cod sursa (job #1460227) | Cod sursa (job #2845657)
#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;
}