Pagini recente » Cod sursa (job #2410328) | Cod sursa (job #1781638) | Cod sursa (job #1145450) | Cod sursa (job #904555) | Cod sursa (job #64589)
Cod sursa(job #64589)
#include<stdio.h>
const int maxn = 60000;
int i;
int n;
int k;
int a[maxn];
int din[maxn];
int max(int i,int j)
{
return i > j ? i : j;
}
int st[maxn];
int m;
int t;
int sump[maxn];
int l;
int j;
int sol[maxn];
int sum;
int main()
{
freopen("euro.in","r",stdin);
freopen("euro.out","w",stdout);
scanf("%d %d",&n,&k);
for(i = 1;i <= n; ++i)
{
scanf("%d",&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("%d\n",sol[n]);
return 0;
}