Cod sursa(job #1789092)

Utilizator TimitocArdelean Andrei Timotei Timitoc Data 26 octombrie 2016 18:11:22
Problema Euro Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.97 kb
#include <iostream>
#include <cstdio>
#define MAXN 34600
#define RAD 300
#define inf (1LL<<62)

using namespace std;

int n, t, a[MAXN], nq;
long long val[MAXN], pos[MAXN], prev[MAXN], sum[MAXN], din[MAXN];

void prepare()
{
    nq = 1;
    for (int i = 1; i <= n; i++)
    {
        val[nq] = val[nq] + (long long)a[i];
        if (val[nq] < 0 && i != n)
            pos[nq++] = i;
    }
    pos[nq] = n;
    n = nq;
    for (int i = 1; i <= n; i++)
        sum[i] = sum[i-1] + val[i];
}

void solve()
{
    for (int i = 1; i <= n; i++) {
        din[i] = -inf;
        for (int j = i-1; j >= 0 && i-j <= RAD; j--)
            din[i] = max(din[i], din[j] + (sum[i]-sum[j])*pos[i] - t);
    }
    printf("%lld", din[n]);
}

int main()
{
    freopen("euro.in", "r", stdin);
    freopen("euro.out", "w", stdout);

    scanf("%d %d", &n, &t);
    for (int i = 1; i <= n; i++)
        scanf("%d", &a[i]);
    prepare();
    solve();

    return 0;
}