#include <bits/stdc++.h>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/assoc_container.hpp>
#define fast ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define ll long long
#define ld long double
#define el "\n"
#define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update>
#define ordered_multiset tree<ll, null_type,less_equal<ll>, rb_tree_tag, tree_order_statistics_node_update>
using namespace __gnu_pbds;
using namespace std;
const ll N = 1e5 + 5, INF = 1e18;
const ld pi = acos(-1);
const int mod = 1e9 + 7, LOG = 20;
const ld eps = 1e-4;
int dx[] = {0, -1, 0, 1, -1, 1, -1, 1};
int dy[] = { -1, 0, 1, 0, 1, -1, -1, 1};
ll n, m, k, x, y;
ll a[N], b[N];
struct Line {
ll m, b;
mutable function<const Line *()> succ;
bool operator<(const Line &other) const {
return m < other.m;
}
bool operator<(const ll &x) const {
const Line *s = succ();
if (!s) {
return 0;
}
return b - s->b < (s->m - m) * x;
}
};
// will maintain upper hull for maximum
struct DynamicHull : public multiset<Line, less<>> {
bool bad(iterator y) {
auto z = next(y);
if (y == begin()) {
if (z == end()) {
return 0;
}
return y->m == z->m && y->b <= z->b;
}
auto x = prev(y);
if (z == end()) {
return y->m == x->m && y->b <= x->b;
}
return (ld) (x->b - y->b) * (z->m - y->m) >= (ld) (y->b - z->b) * (y->m - x->m);
}
void add(ll m, ll b) {
auto y = insert({m, b});
y->succ = [ = ] { return next(y) == end() ? 0 : &*next(y); };
if (bad(y)) {
erase(y);
return;
}
while (next(y) != end() && bad(next(y))) {
erase(next(y));
}
while (y != begin() && bad(prev(y))) {
erase(prev(y));
}
}
ll query(ll x) {
auto l = *lower_bound(x);
return l.m * x + l.b;
}
};
void dowork() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
for (int i = 1; i <= n; i++) {
cin >> b[i];
}
DynamicHull cht;
cht.add(-b[1], 0);
ll ans;
for (int i = 2; i <= n; i++) {
ans = cht.query(a[i]);
cht.add(-b[i], ans);
}
cout << abs(ans) << el;
}
signed main() {
fast
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
int t = 1;
//cin >> t;
for (int i = 1; i <= t; i++) {
dowork();
}
return 0;
}
2B - The least round way | 1324A - Yet Another Tetris Problem |
246B - Increase and Decrease | 22E - Scheme |
1566A - Median Maximization | 1278A - Shuffle Hashing |
1666F - Fancy Stack | 1354A - Alarm Clock |
1543B - Customising the Track | 1337A - Ichihime and Triangle |
1366A - Shovels and Swords | 919A - Supermarket |
630C - Lucky Numbers | 1208B - Uniqueness |
1384A - Common Prefixes | 371A - K-Periodic Array |
1542A - Odd Set | 1567B - MEXor Mixup |
669A - Little Artem and Presents | 691B - s-palindrome |
851A - Arpa and a research in Mexican wave | 811A - Vladik and Courtesy |
1006B - Polycarp's Practice | 1422A - Fence |
21D - Traveling Graph | 1559B - Mocha and Red and Blue |
1579C - Ticks | 268B - Buttons |
898A - Rounding | 1372B - Omkar and Last Class of Math |