Cod sursa(job #2527004)

Utilizator Stefan_PiscuPiscu Stefan Constantin Stefan_Piscu Data 19 ianuarie 2020 14:26:45
Problema Euro Scor 15
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.96 kb
#include <bits/stdc++.h>
using namespace std;

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

#define INF (1LL<<59)
#define ll long long

class CHT{
  private:
    struct Line{
        long long a, b;
        long long value(long long x){
            return 1LL*a*x+b;
        }
    };

    struct Node{
        Node *ls, *rs;
        Line val;
        Node(){
            ls=NULL;
            rs=NULL;
            val={0, 0};
        }
    };

    Node *aint=NULL;

    void addline(Node *&root, Line f, long long st, long long dr){
        if(root==NULL) root=new Node;
        long long m=(st+dr)/2;
        bool mid=f.value(m)>root->val.value(m);
        bool lef=f.value(st)>root->val.value(st);
        if(mid){
            swap(f, root->val);
        }
        if(st==dr) return;
        else if(mid!=lef){
            addline(root->ls, f, st, m);
        }
        else{
            addline(root->rs, f, m+1, dr);
        }
    }

    long long getline(Node *&root, long long x, long long st, long long dr){
        if(!root) return -INF;
        long long m=(st+dr)/2;
        if(st==dr) return root->val.value(x);
        else if(x<=m){
            return max(root->val.value(x), getline(root->ls, x, st, m));
        }
        else{
            return max(root->val.value(x), getline(root->rs, x, m+1, dr));
        }
    }

  public:
    void add(long long a, long long b){
        Line x={a, b};
        addline(aint, x, 0, INF);
    }

    long long get(long long x){
        return getline(aint, x, 0, INF);
    }

};

CHT LiChao;

int main()
{
    int n, t;
    fin>>n>>t;
    vector<ll> v(n+1, 0);
    vector<ll> s(n+1, 0);
    for(ll i=1;i<=n;++i){
        fin>>v[i];
        s[i]=s[i-1]+v[i];
    }
    vector<ll> dp(n+1, 0);
    LiChao.add(0, 0);
    for(ll i=1;i<=n;++i){
        dp[i]=s[i]*i-t+LiChao.get(i);
        LiChao.add(-s[i], dp[i]);
    }
    fout<<dp[n];
    return 0;
}