Pagini recente » Cod sursa (job #614735) | Cod sursa (job #250741) | Cod sursa (job #1842565) | Cod sursa (job #2256512) | Cod sursa (job #1835227)
/**
Convex Hull Trick
*/
#include <bits/stdc++.h>
#define maxN 34570
using namespace std;
const long long INF=1LL<<60;
int n,t,i,j,st,dr,v[maxN];
int sp[maxN],deq[maxN];
long long dp[maxN];
double cost(int x,int y)
{
double a=dp[x]-dp[y];
int b=sp[x]-sp[y];
if(b>=0 && a<0)
return -INF;
if(b<=0 && a>0)
return INF;
if(b>0 && a>=0)
return a/b;
return INF;
}
int main()
{
freopen("euro.in","r",stdin);
freopen("euro.out","w",stdout);
scanf("%d %d",&n,&t);
for(i=1;i<=n;i++)
scanf("%d",&v[i]),
sp[i]=sp[i-1]+v[i];
st=dr=1;
for(i=1;i<=n;i++)
{
while(st<dr && i>cost(deq[st],deq[st+1]))
st++;
dp[i]=dp[deq[st]]+1LL*(sp[i]-sp[deq[st]])*i-t;
while(st<dr && cost(deq[dr],i)<=cost(deq[dr-1],deq[dr]))
dr--;
deq[++dr]=i;
}
printf("%lld",dp[n]);
return 0;
}