#include <bits/stdc++.h>
using namespace std;
long long inter(array<long long,2>l1, array<long long,2>l2){
    return ((l1[1]-l2[1]))/((l2[0]-l1[0]));
}
signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    int n;
    cin >> n;
    long long arr[n];
    for(long long &i : arr){
        cin >> i;
    }
    for(int i = 1;i<n;i++){
        assert(arr[i]>=arr[i-1]);
    }
    long long dp[n];
    dp[0]=arr[0]*n;
    deque<array<long long,2>>q;
    q.push_back({n-1,dp[0]});
    for(int i = 1;i<n;i++){
        long long mx = arr[i];
        dp[i]=2e18;
        int lo = 0;
        int hi = q.size()-1;
        while(lo<hi){
            int mid = (lo+hi)/2;
            if(inter(q[mid],q[mid+1])<arr[i]){
                lo=mid+1;
            }
            else{
                hi=mid;
            }
        }
        dp[i]=arr[i]*q[lo][0]+q[lo][1];
        dp[i]=min(dp[i],mx*(n));
        long long m = n-i-1;
        long long c = dp[i];
        array<long long,2> l = {m,c};
        while(q.size()>1&&inter(l,q[q.size()-2])<=inter(q[q.size()-1],q[q.size()-2])){
            q.pop_back();
        }
        q.push_back(l);
    }
    cout << dp[n-1];
    return 0;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |