#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100001;
const int MAXX = 1000000;
const int TREE_SIZE = 4 * MAXX;
struct Line {
long long a, b;
long long calc(long long x) {
return a * x + b;
}
long long slope() {
return a;
}
};
struct Lichao {
Line tr[TREE_SIZE];
void build() {
for (int i = 0; i < TREE_SIZE; ++i) {
tr[i] = {0, (long long)1e18};
}
}
void update(Line f, int id, int l, int r) {
if (l == r) {
if (f.calc(l) < tr[id].calc(l)) tr[id] = f;
return;
}
int mid = (l + r) >> 1;
if (f.calc(mid) < tr[id].calc(mid)) swap(f, tr[id]);
if (f.slope() > tr[id].slope()) update(f, id << 1, l, mid);
else update(f, id << 1 | 1, mid + 1, r);
}
long long query(int id, int l, int r, int pos) {
long long res = tr[id].calc(pos);
if (l == r) return res;
int mid = (l + r) >> 1;
if (pos <= mid)
return min(res, query(id << 1, l, mid, pos));
else
return min(res, query(id << 1 | 1, mid + 1, r, pos));
}
};
Lichao lc;
int n;
long long a[MAXN][2], dp[MAXN], sum = 0;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> n;
for (int i = 1; i <= n; ++i) cin >> a[i][0];
for (int i = 1; i <= n; ++i) {
cin >> a[i][1];
sum += a[i][1];
}
lc.build();
dp[1] = -a[1][1];
Line init = {-2 * a[1][0], dp[1] + a[1][0] * a[1][0]};
lc.update(init, 1, 1, MAXX);
for (int i = 2; i <= n; ++i) {
long long val = lc.query(1, 1, MAXX, a[i][0]);
dp[i] = val - a[i][1] + a[i][0] * a[i][0];
Line ne = {-2 * a[i][0], dp[i] + a[i][0] * a[i][0]};
lc.update(ne, 1, 1, MAXX);
}
cout << dp[n] + sum << '\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... |