Pagini recente » Cod sursa (job #2748613) | Cod sursa (job #2215850) | Cod sursa (job #3225058) | Cod sursa (job #2672687) | Cod sursa (job #1515817)
#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;
}