Cod sursa(job #2680195)

Utilizator stefantagaTaga Stefan stefantaga Data 2 decembrie 2020 21:41:22
Problema Euro Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("euro.in");
ofstream g("euro.out");
const long long INF=1e17;
pair <long long,long long> arb[200005];
long long val (long long poz,pair <long long ,long long > func)
{
    return poz*func.first+func.second;
}
void update (int st,int dr,int nod ,pair <long long,long long> line)
{
    int mij=(st+dr)/2;
    bool middle= val(mij,line) < val (mij,arb[nod]);
    bool stanga= val(st,line) < val (st,arb[nod]);
    if (middle==0)
    {
        swap(arb[nod],line);
    }
    if (st==dr)
    {
        return ;
    }
    if (stanga==middle)
    {
        update(st,mij,2*nod,line);
    }
    else
    {
        update(mij+1,dr,2*nod+1,line);
    }
}
long long query (int st,int dr,int nod ,int poz)
{
    if (st==dr)
    {
        return val(poz,arb[nod]);
    }
    long long mij=(st+dr)/2,valoare=val(poz,arb[nod]);
    if (poz<=mij)
    {
        return max(valoare,query(st,mij,2*nod,poz));
    }
    else
    {
        return max(valoare,query(mij+1,dr,2*nod+1,poz));
    }
}
int n,t;
long long din[100005],i,v[100005],s[100005];
int main()
{
    f>>n>>t;
    for (i=1;i<=n;i++)
    {
        f>>v[i];
    }
    for (i=1;i<=4*n;i++)
    {
        arb[i]={0,-INF};
    }
    for (i=1;i<=n;i++)
    {
        s[i]=s[i-1]+v[i];
        din[i]=din[i-1]+v[i]*i;
        din[i]=max(din[i],query(1,n,1,i)+s[i]*i-t);
        update(1,n,1,{-s[i],din[i]});
    }
    g<<din[n];
    return 0;
}