Cod sursa(job #2243543)

Utilizator jack92657Jacky boy jack92657 Data 20 septembrie 2018 20:10:41
Problema Euro Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.93 kb
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

const ll nmax = 34567+5;
ll n, t, v[nmax], pr[nmax], mn[nmax], pd[nmax], sol = -(1ll<<62);

int main()
{
    ifstream fin ("euro.in");
    ofstream fout ("euro.out");
    fin >> n >> t;
    for (int i = 1; i <= n; ++i){
        fin >> v[i];
        pr[i] = pr[i-1] + v[i];
        mn[i] = mn[i-1];
        if(pr[mn[i-1]] > pr[i])
            mn[i] = i;
    }
    if(n <= 2000){
        for (int i = 1; i <= n; ++i){
            pd[i] = -(1ll<<62);
            for (int j = 0; j < i; ++j)
                pd[i] = max(pd[i], pd[j]+i*(pr[i]-pr[j]));
            pd[i] -= t;
        }
        fout << pd[n] << "\n";
        return 0;
    }
    ll p = n, now = 0, iterations = 0;
    while(p >= 1){
        ++iterations;
        now += (pr[p]-pr[mn[p-1]])*p;
        p = mn[p-1];
        sol = max(sol, now+pr[p]*p-(iterations+(p!=0))*t);
    }
    fout << sol << "\n";
    return 0;
}