Cod sursa(job #3175510)

Utilizator NutaAlexandruASN49K NutaAlexandru Data 25 noiembrie 2023 21:52:51
Problema Euro Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <bits/stdc++.h>
using namespace std;
#define all(x) x.begin(),x.end()
#define pb push_back
#define bug(x) cerr<<#x<<" ( "<<x<<endl
using i64=long long;
const int mod=1e9+7;
const int inf=1e9;
struct linie
{
    i64 a,b;
    i64 calculate(i64 x)
    {
        return x*a+b;
    }
};
i64 intersect(linie x,linie y)
{
    return (y.b-x.b+x.a-y.a-1)/(x.a-y.a);
}
namespace LI_CHAO
{
    //cautam maxim
    const int N=34567;
    linie a[ 4*N+1 ];
    //daca iti denumesti var xd clar viata ta nu e xd
    //verificam si paralitate
    //paralicitate sau cum plm se zice nu ma corecta stiu ca is prea bun la ro
    void add(int nod,int st,int dr,linie& xd)
    {
        int m=(st+dr>>1);
        if(a[nod].calculate(m)<xd.calculate(m))
        {
            swap(a[nod],xd);
        }
        if(st<m && a[nod].calculate(st)<xd.calculate(st))
        {
            add(nod<<1,st,m-1,xd);
        }
        if(m<dr && a[nod].calculate(dr)<xd.calculate(dr))
        {
            add(1<<nod|1,m+1,dr,xd);
        }
    }
    i64 query(int nod,int st,int dr,int poz)
    {
        int m=(st+dr>>1);
        if(m==poz)
        {
            return a[nod].calculate(poz);
        }
        if(m>poz)
        {
            return max(a[nod].calculate(poz),query(nod<<1,st,m-1,poz));
        }
        return max(a[nod].calculate(poz),query(nod<<1|1,m+1,dr,poz));
    }
    void add(linie xd)
    {
        add(1,1,N,xd);
    }
    i64 query(int poz)
    {
        return query(1,1,N,poz);
    }
}
main()
{
    ifstream cin("euro.in");
    ofstream cout("euro.out");
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n,t;
    cin>>n>>t;
    for(int i=1,s=0;i<=n;i++)
    {
        int x;
        cin>>x;
        s+=x;
        i64 sol=1LL*s*i-t+LI_CHAO::query(i);
        LI_CHAO::add({-s,sol});
        if(i==n)
        {
            cout<<sol;
        }
    }

}