#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
const int maxn=5e3+10;
double ins(pair<int,int> p1,pair<int,int> p2)
{
    return (p1.second-p2.second)*1.0/(p2.first-p1.first);
}
signed main()
{
    ios::sync_with_stdio(0);
    int n;
    cin>>n;
    vector<int>a(n+1);
    vector<int>dp(n+1);
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    vector<pair<int,int>>convexH;
    dp[0]=0;
    int idx=0;
    int last=0;
    for(int i=1;i<=n;i++)
    {
        if(!last || a[i]>a[last])
        {
            for(int j=last+1;j<=i;j++)
            {
                pair<int,int>p={n-j+1,dp[j-1]};
                while(convexH.size()>1 && ins(convexH[convexH.size()-2],convexH.back())>ins(convexH.back(),p))
                {
                    convexH.pop_back();
                }
                convexH.push_back(p);
            }
            last=i;
        }
        idx=min(idx,(int)convexH.size()-1);
        while(idx+1<convexH.size() && ins(convexH[idx],convexH[idx+1])<a[last])
        {
            idx++;
        }
        dp[i]=convexH[idx].first*a[last]+convexH[idx].second;
    }
    cout << dp[n] << '\n';
}
| # | 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... |