#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<ll, ll>
#define fi first
#define sec second
#define ld long double
const ll MAXN = 2e5;
const ll INF = 4e18;
const ll MOD = 998244353;
struct line{
ll m, c;
};
int main(){
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int tc = 1;
// cin >> tc;
for(;tc--;){
ll N; cin >> N;
vector<ll> a(N + 5), dp(N + 5);
for(int i = 1; i <= N; i++) cin >> a[i];
vector<line> stk;
dp[0] = 0;
stk.push_back({N, 0});
auto intersection = [&](line A, line B){
return (ld)(B.c - A.c) / (ld)(A.m - B.m);
};
auto cek = [&](line A, line B, line C){
ll i = B.c - A.c, j = A.m - B.m;
ll k = C.c - B.c, l = B.m - C.m;
if(i / j != k / l) return i / j > k / l;
i %= j, k %= l;
return i * l > j * k;
};
auto ins = [&](line a){
while(stk.size() >= 1 && stk.back().m == a.m) stk.pop_back();
while(stk.size() >= 2){
if(!cek(a, stk[stk.size() - 1], stk[stk.size() - 2])){
stk.pop_back();
}
else break;
}
stk.push_back(a);
};
auto F = [&](ll idx, ll x){
return stk[idx].m * x + stk[idx].c;
};
ll MX = -1;
for(int i = 1; i <= N; i++){
MX = max(MX, a[i]);
ll lf = 1, rg = stk.size() - 1, ans = 0;
for(;lf <= rg;){
ll mid = (lf + rg) / 2;
if(intersection(stk[mid - 1], stk[mid]) <= MX){
ans = mid;
lf = mid + 1;
}
else rg = mid - 1;
}
dp[i] = F(ans, MX);
ins({N - i, dp[i]});
}
cout << dp[N] << "\n";
}
}
/*
dp[i] = max(dp[i], dp[j] + (n - j) * MX)
*/
# | 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... |