#include <bits/stdc++.h>
using namespace std;
struct CHT {
  vector<long long> m, b;
  bool bad(int f1, int f2, int f3) {
    return 1.0 * (b[f3] - b[f1]) * (m[f1] - m[f2]) <=
           1.0 * (b[f2] - b[f1]) * (m[f1] - m[f3]);
  }
  void add(long long mm, long long bb) {
    m.emplace_back(mm);
    b.emplace_back(bb);
    int sz = m.size();
    while (sz >= 3 && bad(sz - 3, sz - 2, sz - 1)) {
      m.erase(m.end() - 2);
      b.erase(b.end() - 2);
      sz--;
    }
  }
  long long f(int i, long long x) { return m[i] * x + b[i]; }
  long long query(long long x) {
    int lo = 0;
    int hi = m.size() - 1;
    while (true) {
      if (hi - lo < 3) {
        long long min1 = f(lo, x);
        long long min2 = f(hi, x);
        long long min3 = 1e18;
        if (lo + 1 < hi) min3 = f(lo + 1, x);
        return min(min1, min(min2, min3));
      }
      int mid1 = lo + (hi - lo) / 3;
      int mid2 = hi - (hi - lo) / 3;
      long long y1 = f(mid1, x);
      long long y2 = f(mid2, x);
      if (y1 <= y2)
        hi = mid2;
      else
        lo = mid1;
    }
  }
  void Clear() {
    m.clear();
    b.clear();
  }
} cht;
static const int maxn = 1e5 + 5;
int n;
long long a[maxn], b[maxn], dp[maxn];
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) scanf("%lld", &a[i]);
  for (int i = 1; i <= n; i++) scanf("%lld", &b[i]);
  dp[1] = 0;
  cht.add(b[1], dp[1]);
  for (int i = 2; i <= n; i++) {
    dp[i] = cht.query(a[i]);
    cht.add(b[i], dp[i]);
  }
  printf("%lld", dp[n]);
}
