Cod sursa(job #1835227)

Utilizator LucianTLucian Trepteanu LucianT Data 26 decembrie 2016 16:12:13
Problema Euro Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.93 kb
/**
    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;
}