Cod sursa(job #2919594)

Utilizator toma_ariciuAriciu Toma toma_ariciu Data 18 august 2022 13:20:00
Problema Euro Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <fstream>

using namespace std;
#define int long long

ifstream fin("euro.in");
ofstream fout("euro.out");

const int maxN = 35000, inf = (1LL << 60);
struct arbint {
    int x, y;
}aint[4 * maxN];
int n, t, sp[maxN], dp[maxN];

void update(int nod, int st, int dr, int x, int y)
{
    if(st == dr)
    {
        if(x * st + y > aint[nod].x * st + aint[nod].y)
            aint[nod] = {x, y};
        return;
    }
    int med = (st + dr) / 2;
    bool ok1 = 0, ok2 = 0;
    if(aint[nod].x * dr + aint[nod].y < x * dr + y)
        ok2 = 1;
    if(aint[nod].x * med + aint[nod].y < x * med + y)
    {
        ok1 = 1;
        swap(aint[nod].x, x);
        swap(aint[nod].y, y);
    }
    if(ok1 == ok2)
        update(2 * nod, st, med, x, y);
    else
        update(2 * nod + 1, med + 1, dr, x, y);
}

int query(int nod, int st, int dr, int poz)
{
    if(st == dr)
        return aint[nod].x * poz + aint[nod].y;
    int med = (st + dr) / 2, aux = aint[nod].x * poz + aint[nod].y;
    if(poz <= med)
        aux = max(aux, query(2 * nod, st, med, poz));
    else
        aux = max(aux, query(2 * nod + 1, med + 1, dr, poz));
    return aux;
}

signed main()
{
    fin >> n >> t;
    for(int i = 1; i <= n; i++)
    {
        fin >> sp[i];
        sp[i] += sp[i - 1];
    }
    for(int i = 1; i <= n; i++)
    {
        dp[i] = query(1, 1, n, i) + sp[i] * i - t;
        update(1, 1, n, -sp[i], dp[i]);
    }
    fout << dp[n];
    return 0;
}