#include <iostream>
using namespace std;
#define ll long long
const int N = 1e5 + 10;
const int M = 1e6 + 10;
const ll INF = 1e18;
int n;
ll h[N], w[N], dp[N];
struct lichao {
struct line {
ll a, b;
line() {a = b = INF;}
line(ll A, ll B) {a = A, b = B;}
ll calc(ll val) {return a == INF ? INF : a * val + b;}
ll slope() {return a;}
} st[M << 2];
void update(int l, int r, line f, int id) {
int m = (l + r) >> 1;
if (st[id].calc(m) > f.calc(m)) swap(st[id], f);
if (l == r) return;
if (f.slope() < st[id].slope()) update(m + 1, r, f, id << 1);
if (f.slope() > st[id].slope()) update(l, m, f, id << 1 | 1);
}
ll get(int l, int r, int u, int id) {
ll cur = st[id].calc(u);
if (l == r) return cur;
int m = (l + r) >> 1;
if (u <= m) return min(cur, get(l, m, u, id << 1));
return min(cur, get(m + 1, r, u, id << 1 | 1));
}
} Tree;
int main() {
cin.tie(nullptr);
cout.tie(nullptr);
ios_base::sync_with_stdio(false);
cin >> n;
for (int i = 1; i <= n; ++i) cin >> h[i];
for (int i = 1; i <= n; ++i) {
cin >> w[i];
w[i] += w[i - 1];
}
dp[1] = 0;
Tree.update(0, 1e6, lichao::line(-2 * h[1], h[1] * h[1] - w[1]), 1);
for (int i = 2; i <= n; ++i) {
dp[i] = Tree.get(0, 1e6, h[i], 1) + h[i] * h[i] + w[i - 1];
Tree.update(0, 1e6, lichao::line(-2 * h[i], h[i] * h[i] + dp[i] - w[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... |