Cod sursa(job #2849346)

Utilizator stefanvoicaVoica Stefan stefanvoica Data 14 februarie 2022 22:17:06
Problema Euro Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <bits/stdc++.h>
#define int long long
using namespace std;

ifstream fin ("euro.in");
ofstream fout("euro.out");
const int dim=34569;
int sp[dim],dp[dim];

struct el
{
    int a, b;
} v[4*dim];

int y(el line,int x)
{
    int res=line.a*x + line.b;
    return res;
}

void update(int nod,int l,int r,el line)
{
    if (l==r)
    {
        if (y(line,nod) > y(v[nod],nod))
            v[nod] = line;
        return;
    }
    int m=(l+r)/2;
    int vechi = y(v[nod],m), nou = y(line,m);
    if (vechi<nou)
        swap(v[nod],line);
    if (line.a<0)
            update(2*nod,l,m,line);
    else    update(2*nod+1,m+1,r,line);
}

int query (int nod,int l,int r,int x)
{
    int val=y(v[nod],x);
    if (l==r)
        return val;
    int m=(l+r)/2;
    if (x<=m)
        return max(query(2*nod,l,m,x),val);
    else    return max(query(2*nod+1,m+1,r,x),val);
}


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