Submission #1298198

#TimeUsernameProblemLanguageResultExecution timeMemory
1298198random_nameDischarging (NOI20_discharging)C++20
20 / 100
358 ms23932 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

bool comcross(pair<ll, ll> a, pair<ll, ll> b, pair<ll, ll> c){
    return (c.second - a.second) * (b.first - c.first) >= (c.second - b.second) * (a.first - c.first);
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    ll n;cin>>n;
    vector<ll> A(n); for(ll &i:A) cin>>i;

    vector<ll> suf(n);
    suf[0] = A[0];
    for(ll i=1;i<n;i++){
        suf[i] = max(suf[i-1], A[i]);
    }

    vector<ll> dp(n, LONG_LONG_MAX);
    deque<pair<ll, ll>> cht;
    dp[n-1] = n*suf[n-1];
    cht.push_front({-suf[n-1], dp[n-1]});

    auto x_int = [&](pair<ll, ll> &a, pair<ll, ll> &b) -> long double {
        return (long double)(b.second - a.second) / (a.first - b.first);
    };

    for(ll i=n-2;i>=0;i--){
        // for(auto i:cht){
        //     cout << i.first << ':' << i.second << ' ';
        // }
        // cout << '\n';

        while(cht.size() > 1){
            pair<ll, ll> l1 = cht[cht.size() - 1], l2 = cht[cht.size() - 2];
            if(l2.first*(i+1) + l2.second <= l1.first*(i+1) + l1.second){
                cht.pop_back();
            }

            else
                break;
        }   
        dp[i] = (cht.back().first*(i+1) + cht.back().second) + suf[i]*n;

        while(cht.size() >= 1 && cht.front().first == -suf[i]){
            if(cht.front().second <= dp[i])
                break;

            else
                cht.pop_front();
        }

        pair<ll, ll> line = {-suf[i], dp[i]};
        while(cht.size() > 1 && x_int(cht.front(), line) >= x_int(cht.front(), cht[1]))
            cht.pop_front();

        cht.push_front({-suf[i], dp[i]});
    }

    ll mn=LONG_LONG_MAX;
    for(ll i:dp){
        // cout << i << ' ';
        mn = min(mn, i);
    }

    cout << mn << '\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...