Cod sursa(job #1515814)

Utilizator chiriacandrei25Chiriac Andrei chiriacandrei25 Data 2 noiembrie 2015 10:53:02
Problema Euro Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.89 kb
#include <fstream>
#define Nmax 35000
#define eps 0.00000001

using namespace std;

int a[Nmax],s[Nmax],Q[Nmax],st=1,dr=1,n,T;
long long dp[Nmax];

inline double when(int j2, int j1)
{
    if(s[j1]-s[j2]<0) return Nmax;
    if(s[j1]==s[j2])
    {
        if(dp[j1]-dp[j2]<=0) return -Nmax;
        else return Nmax;
    }
    return (long double)(dp[j1]-dp[j2]) / (long double)(s[j1]-s[j2]);
}

int main()
{
    int i;
    ifstream cin("euro.in");
    ofstream cout("euro.out");
    cin>>n>>T;
    for(i=1;i<=n;++i)
    {
        cin>>a[i]; s[i]=s[i-1]+a[i];
    }
    for(i=1;i<=n;++i)
    {
        while(st<dr && dp[Q[st]]+ 1LL*(s[i]-s[Q[st]])*i < dp[Q[st+1]]+ 1LL*(s[i]-s[Q[st+1]])*i) ++st;
        dp[i]=dp[Q[st]]+ 1LL*(s[i]-s[Q[st]])*i-T;
        while(dr-st && when(i,Q[dr])-when(Q[dr],Q[dr-1])<=eps) --dr;
        Q[++dr]=i;
    }
    cout<<dp[n];
    return 0;
}