Cod sursa(job #23392)

Utilizator astronomyAirinei Adrian astronomy Data 28 februarie 2007 18:57:07
Problema Euro Scor 85
Compilator c Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <stdio.h>

#define MAXN (1 << 16)

typedef long long llong;

const int SQRT = 380;

int N;
llong T, P, A[MAXN], S[MAXN], end[MAXN];
llong best[MAXN];

void solve(void)
{
    int i, j, k, fin;
    llong aux, r, sum;

    for(i = 1, sum = 0; i < N; i++)
    {
        sum += (llong)A[i];
        if(sum < 0)
            S[++P] = sum, end[P] = (llong)i, sum = 0;
    }
    sum += (llong)A[N], S[++P] = sum, end[P] = (llong)N;

    for(i = 1; i <= P; i++)
    {
        r = S[i]*end[i]+best[i-1], sum = S[i];
        
        for(j = i-1; j >= i-SQRT && j >= 1; j--)
        {
            sum += S[j];
            aux = sum*end[i]+best[j-1];
            if(aux > r)
                r = aux;
        }
        best[i] = r-T;
    }
}

void read_data(void)
{
    int i;

    scanf("%d %lld\n", &N, &T);

    for(i = 1; i <= N; i++)
        scanf("%lld ", &A[i]);
}


void write_data(void)
{
    printf("%lld\n", best[P]);
}

int main(void)
{
    freopen("euro.in", "rt", stdin);
    freopen("euro.out", "wt", stdout);

    read_data();
    solve();
    write_data();
    
    return 0;
}