Pagini recente » Cod sursa (job #1056624) | Cod sursa (job #2821821) | Cod sursa (job #2948334) | Cod sursa (job #1575908) | Cod sursa (job #64590)
Cod sursa(job #64590)
#include<stdio.h>
const long long maxn = 60000;
long long i;
long long n;
long long k;
long long a[maxn];
long long din[maxn];
long long max(long long i,long long j)
{
return i > j ? i : j;
}
long long st[maxn];
long long m;
long long t;
long long sump[maxn];
long long l;
long long j;
long long sol[maxn];
long long sum;
int main()
{
freopen("euro.in","r",stdin);
freopen("euro.out","w",stdout);
scanf("%lld %lld",&n,&k);
for(i = 1;i <= n; ++i)
{
scanf("%lld",&a[i]);
sump[i] = sump[i - 1] + a[i];
}
for(i = 1;i <= n; ++i)
{
sum += a[i];
if (sum < 0 || i == n)
{
while((sump[i] - sump[st[l - 1]]) * i + sol[st[l - 1]] - k > (sump[i] - sump[st[l]]) * i + sol[st[l]] - k)
{
--l;
}
sol[i] = (sump[i] - sump[st[l]]) * i + sol[st[l]] - k;
sum = 0;
++l;
st[l] = i;
}
}
/* if (sum != 0)
{
sol[n] += sum * n;
sol[n] -= k;
} */
/* for(i = 1;i <= n; ++i)
{
din[i] = -20000000;
for(j = max(0,i - 256);j <= i; ++j)
{
din[i] = max(din[i],din[j] + (sump[i] - sump[j]) * i - k);
}
} */
/* for(i = 1;i <= n; ++i)
{
din[i] = max(sump[i] * i - k, din[st[1]] + (sump[i] - sump[st[1]]) * i - k);
while(din[st[l]] - sump[st[l]] && l)
{
--l;
}
++l;
st[l] = i;
} */
printf("%lld\n",sol[n]);
return 0;
}