#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;
}
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 = 1;
int hi = q.size()-1;
while(lo<hi){
int mid = (lo+hi)/2;
if(inter(q[mid],q[mid-1])>=arr[i]){
hi=mid;
}
else{
lo=mid+1;
}
}
if(q.size()==1){
lo=0;
}
if(q.size()==1||(lo==1&&inter(q[0],q[1])>=arr[i])){
lo=0;
}
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... |