Submission #267135

#TimeUsernameProblemLanguageResultExecution timeMemory
267135eohomegrownappsDischarging (NOI20_discharging)C++14
100 / 100
891 ms6904 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef long double ld;

struct Line{
    ll m, c;
    Line(ll _m, ll _c){
        m=_m;c=_c;
    }

    ll f(ll x){
        return m*x+c;
    }

    ld intersectX(Line l){
        return (1.0*l.c-c)/(m-l.m);
    }
};

deque<Line> hull;

bool isBetter(Line l){
    return (l.intersectX(hull[hull.size()-1])<l.intersectX(hull[hull.size()-2]));
}

void add(Line l){
    if (hull.size()>0&&hull.back().m==l.m){
        if (l.c<hull.back().c){
            hull.pop_back();
            hull.push_back(l);
        }
        return;
    }
    while (hull.size()>1&&isBetter(l)){
        hull.pop_back();
    }
    hull.push_back(l);
}

ll query(ll x){
    while (hull.size()>1&&hull[0].f(x)>hull[1].f(x)){
        hull.pop_front();
    }
    return hull.front().f(x);
}

int main(){
    ll n;
    cin>>n;
    add(Line(n,0));
    ll prev = 0;
    ll ans;
    for (ll i = 1; i<=n; i++){
        ll val;
        cin>>val;
        if (val<prev){
            val=prev;
        }
        /*cout<<"val: "<<val<<'\n';
        for (auto h : hull){
            cout<<h.m<<' '<<h.c<<'\n';
        }*/
        prev=val;
        ans = query(val);
        add(Line{n-i,ans});
        //cout<<ans<<'\n';
    }
    cout<<ans<<'\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...