Cod sursa(job #55369)

Utilizator dominoMircea Pasoi domino Data 27 aprilie 2007 10:27:46
Problema Euro Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.03 kb
#include <stdio.h>

#define MAX_N 34567
#define FIN "euro.in"
#define FOUT "euro.out"

int N, n, T, t, A[MAX_N], S[MAX_N], D[MAX_N];
long long bst[MAX_N];

int main(void)
{
    int i, j, s, ts;
    long long x;

    freopen(FIN, "r", stdin);
    freopen(FOUT, "w", stdout);

    scanf("%d %d", &N, &T);
    for (i = 0; i < N; i++)
        scanf("%d", A+i);

    for (s = i = 0; i+1 < N; i++)
        if ((s += A[i]) < 0) 
        {
            S[n] = s;
            D[n++] = i+1;
            s = 0;
        }
    S[n] = s + A[N-1]; D[n++] = N;

    for (t = 1; t * t < T; t++); t <<= 1;

    bst[0] = (long long) S[0] * (long long) D[0]-T, ts = S[0];
    for (i = 1; i < n; i++)
    {
        bst[i] = (long long) (ts += S[i]) * (long long) D[i]-T;
        for (s = S[i], j = i-1; j >= 0 && j > i-t; j--)
        {
            x = bst[j] + (long long) s * (long long) D[i]-T;
            if (bst[i] < x) bst[i] = x;
            s += S[j];
        }
    }

    printf("%lld\n", bst[n - 1]);
    
    return 0;
}