#include <bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define per(i,a,b) for(int i=a;i>=b;--i)
#define pb push_back
const int MAXN = 1e6 + 10;
const int INF = 1e18+10;
int a[MAXN], dp[MAXN];
int eval(int i, int x) {
return dp[i-1] + a[i]*x;
}
double intersect(int i, int j) {
return (double)(dp[i-1] - dp[j-1]) / (a[i] - a[j]);
}
int32_t main(){
ios::sync_with_stdio(0);cin.tie(0);
int n;cin >> n;
rep(i,1,n) cin >> a[i];
reverse(a+1,a+n+1);
deque<int> q;
q.push_back(1);
rep(i,1,n) {
while (q.size() > 1 && eval(q[0], i) >= eval(q[1], i)) q.pop_front();
dp[i] = eval(q.front(), i);
while (q.size() > 1 && intersect(q.back(), q[q.size()-1]) <= intersect(q[q.size()-1], i)) q.pop_back();
q.push_back(i+1);
}
cout << dp[n] << '\n';
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... |