Cod sursa(job #1518411)

Utilizator atatomirTatomir Alex atatomir Data 5 noiembrie 2015 21:38:21
Problema Euro Scor 75
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#include <cmath>

using namespace std;

#define mp make_pair
#define pb push_back

#define maxN 35111

int n, i;
long long t;
long long dp[maxN];
long long sum[maxN];

long long _time[maxN];
int work[maxN];
int qL, qR;

long long getTime(int j1, int j2) {
    long long b = dp[j1] - dp[j2];
    long long a = sum[j2] - sum[j1];

    if (a == 0)
        if (b > 0)
            return n + 1;
        else
            return -(n + 1);
    if (a < 0)
        return (b + a - 1) / -a;
    return n + 1;
}

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

    scanf("%d%lld", &n, &t);
    for (i = 1; i <= n; i++) {
        scanf("%lld", &sum[i]);
        sum[i] += sum[i - 1];
    }

    qL = qR = 1;
    work[1] = 0;
    _time[0] = -n - 18;

    for (i = 1; i <= n; i++) {
        while (qR - qL + 1 > 1 && _time[ work[qL + 1] ] <= i) qL++;

        int prov = work[qL];
        dp[i] = dp[prov] - t + (sum[i] - sum[prov]) * i;

        while (qR - qL + 1 > 1 && getTime(work[qR], i) <= _time[ work[qR] ]) qR--;
        _time[i] = getTime(work[qR], i);
        work[++qR] = i;
    }

    printf("%lld", dp[n]);

    return 0;
}