Pagini recente » Cod sursa (job #3142212) | Cod sursa (job #2833786) | Cod sursa (job #1026100) | Cod sursa (job #1739857) | Cod sursa (job #87436)
Cod sursa(job #87436)
#include <cstdio>
#define Nmax 50005
#define ll long long
int n, t, st, dr;
int sir[Nmax];
ll g[Nmax], c[Nmax];
ll sum[Nmax];
ll d[Nmax];
int Q[Nmax];
void citire()
{
int i;
scanf("%d %d", &n, &t);
for (i = 1; i <= n; ++i)
scanf("%d", &sir[i]);
}
double f(int k1, int k2)
{
double ret = 0;
ret = (d[k1 + 1] - d[k2 + 1]);
ret += (double)(sum[k1] * c[k1]);
ret -= (double)(sum[k2] * c[k2]);
ret /= (c[k1] - c[k2]);
return ret;
}
void solve()
{
int i, ct;
ll suma;
suma = ct = 0;
for (i = 1; i <= n; ++i)
{
suma += sir[i];
if (suma < 0)
{
g[++ct] = suma;
c[ct] = i;
suma = 0;
}
}
if (suma != 0)
{
g[++ct] = suma;
c[ct] = n;
}
n = ct;
for (i = 1; i <= n + 1; ++i)
sum[i] = sum[i - 1] + g[i];
st = 1;
dr = 0;
for (i = n; i >= 1; --i)
{
while (st < dr && f(Q[dr - 1], Q[dr]) > f(Q[dr], i)) --dr;
Q[++dr] = i;
while (st < dr && (double)sum[i - 1] >= f(Q[st], Q[st + 1])) ++st;
d[i] = d[Q[st] + 1] + (sum[Q[st]] - sum[i - 1]) * c[Q[st]] - t;
}
printf("%lld\n", d[1]);
}
int main()
{
freopen("euro.in", "r", stdin);
freopen("euro.out", "w", stdout);
citire();
solve();
return 0;
}