Pagini recente » Cod sursa (job #2819434) | Cod sursa (job #1984065) | Cod sursa (job #2446022) | Cod sursa (job #665723) | Cod sursa (job #55312)
Cod sursa(job #55312)
#include <stdio.h>
#define FIN "euro.in"
#define FOUT "euro.out"
#define MAX_N 35000
#define ll long long
#define calc(i, j) (A[j] + (ll)(S[i]-S[j])*D[i] - T) // j < i
#define better(i, j, k) (calc(i, j) >= calc(i, k)) // j, k < i
#define useless(i, j, k) ((A[i]-A[j])*(S[j]-S[k]) >= (A[j]-A[k])*(S[i]-S[j])) // i < j < k
int N, T, n, S[MAX_N], D[MAX_N], Q[MAX_N], ql, qr;
ll A[MAX_N];
int main(void)
{
int i, x, sum = 0;
freopen(FIN, "r", stdin);
freopen(FOUT, "w", stdout);
scanf("%d %d", &N, &T);
for (n = 0, i = 1; i <= N; i++)
{
scanf("%d", &x);
if ((sum += x) < 0)
{
S[n+1] = S[n]+sum;
D[++n] = i;
sum = 0;
}
}
if (D[n] != N)
S[n+1] = S[n]+sum, D[++n] = N;
Q[ql = qr = 0] = 0;
for (i = 1; i <= n; i++)
{
/* for (; ql < qr && better(i, Q[ql+1], Q[ql]); ql++);
A[i] = calc(i, Q[ql]);
for (; ql < qr && useless(Q[qr-1], Q[qr], i); qr--);
Q[++qr] = i;*/
A[i] = calc(i, Q[ql]);
for (; ql <= qr && better(i+1, i, Q[qr-1]); qr--);
Q[++qr] = i;
}
printf("%lld\n", A[n]);
return 0;
}