#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... |