Pagini recente » Cod sursa (job #2081336) | Cod sursa (job #638289) | Cod sursa (job #2981029) | Cod sursa (job #2927330) | Cod sursa (job #23472)
Cod sursa(job #23472)
/*
* O(N) solution
* Reference: batch IOI 2002
*/
#include <stdio.h>
#define MAXN 34569
int N, Nin, T;
int x[MAXN], init[MAXN], d[MAXN], s[MAXN];
long long best[MAXN];
inline double g(int a, int b)
{
return ((double)best[a - 1] - best[b - 1]) / ((double)s[a + 1] - s[b - 1]);
}
int D[MAXN], dl, dr;
int main()
{
freopen("euro.in", "rt", stdin);
freopen("euro.out", "wt", stdout);
scanf("%d %d", &Nin, &T);
int i, S = 0;
s[ N = 0 ] = 0;
for (i = 1; i <= Nin; i++)
{
scanf("%d", init + i);
S += init[i]; //atata timp cat am in cont o valoare pozitiva nu voi obtine profitul maxim daca fac conversie
if (S < 0) //abia atunci cand obtin in cont o valoare negativa trebuie sa iau in considerare conversia
{ //=> comprim intervalele cu valori pozitive
x[ ++N ] = S;
s[ N ] = s[ N - 1 ] + S;
d[ N ] = i;
S = 0;
}
}
if (d[ N ] != Nin)
{
x[ ++N ] = S;
s[ N ] = s[ N - 1 ] + S;
d[ N ] = Nin;
}
best[0] = 0;
D[dl = dr = 0] = 0;
for (i = 1; i <= N; i++)
{
while (dl < dr && g( D[dl + 1], D[dl] ) <= d[i])
dl++;
best[i] = d[i] * (long long)s[i] - T; //toata secventa 0..i
long long aux = best[ D[dl] ] + d[i] * ((long long)s[i] - s[ D[dl] ]) - T;
if (aux > best[i])
best[i] = aux; //secventa D[dl]+1..i
while (dl < dr && g( D[dr - 1], D[dr] ) >= g( D[dr], i ))
dr--;
D[++dr] = i;
}
printf("%lld\n", best[N]);
return 0;
}