#include #define unlikely(x) __builtin_expect(!!(x), 0) struct char_reader { FILE *f; char *buf, *p1, *p2; int size; char_reader(FILE *fin, int bufsize = 1 << 16) { f = fin; size = bufsize; p1 = p2 = 0; buf = new char[size]; } ~char_reader() { delete[]buf; } inline int operator()() { return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, size, f), p1 == p2) ? EOF : *p1++; } }; struct char_writer { FILE *f; char *buf, *p, *end; int size; char_writer(FILE *fout, int bufsize = 1 << 16) { f = fout; size = bufsize; buf = new char[size]; p = buf; end = buf + bufsize; } ~char_writer() { fwrite(buf, p - buf, 1, f); delete[]buf; } inline char operator()(char ch) { if (unlikely(end == p)) { fwrite(buf, end - buf, 1, f); p = buf; } return *p++ = ch; } }; char_reader gch(stdin); char_writer wch(stdout); templateinline int read(T &t) { bool f = false; int ch; while (ch = gch(), !((ch >= '0' && ch <= '9') || ch == '-')) if (ch == EOF) return 0; t = 0; if (ch == '-') f = true, ch = gch(); t = ch ^ 48; while (ch = gch(), ch >= '0' && ch <= '9') t = (t << 3) + (t << 1) + (ch ^ 48); if (f) t = -t; return 1; } inline int read(char &c) { c = 0; int ch; while (ch = gch(), (ch == ' ' || ch == '\n' || ch == '\r' || ch == '\t')) if (ch == EOF) return 0; c = ch; return 1; } inline int read(char *s) { int ch; while (ch = gch(), (ch == ' ' || ch == '\n' || ch == '\r' || ch == '\t')) if (ch == EOF) return 0; *s++ = ch; while (ch = gch(), !(ch == ' ' || ch == '\n' || ch == '\r' || ch == '\t') && ch != EOF) *s++ = ch; *s++ = 0; return 1; } inline int read(const char *s) { return read((char *)s); } inline int readline(char *s) { int ch; while (ch = gch(), (ch == ' ' || ch == '\n' || ch == '\r' || ch == '\t')) if (ch == EOF) return 0; *s++ = ch; while (ch = gch(), !(ch == '\n' || ch == '\r') && ch != EOF) *s++ = ch; *s++ = 0; return 1; } inline int readline(const char *s) { return readline((char *)s); } templateinline void write(T t) { int stk[20], cnt = 0; if (t == 0) { wch('0'); return; } if (t < 0) { wch('-'); t = -t; } while (t > 0) { stk[cnt++] = t % 10; t /= 10; } while (cnt) wch(stk[--cnt] + '0'); } inline void write(char t) { wch(t); } inline void write(char *s) { while (*s) wch(*s++); } inline void write(const char *s) { write((char *)s); } #if __cplusplus >= 201103L templateinline int read(T &t, Args&... args) { return read(t) + read(args ...); } templateinline void write(T t, Args... args) { write(t); write(args ...); } #else // if __cplusplus >= 201103L templateinline int read(A_t &a, B_t &b) { return read(a) + read(b); } templateinline int read(A_t &a, B_t &b, C_t &c) { return read(a) + read(b) + read(c); } templateinline int read( A_t &a, B_t &b, C_t &c, D_t &d) { return read(a) + read(b) + read(c) + read(d); } templateinline void write(A_t a, B_t b) { write(a); write(b); } templateinline void write(A_t a, B_t b, C_t c) { write(a); write(b); write(c); } templateinline void write( A_t a, B_t b, C_t c, D_t d) { write(a); write(b); write(c); write(d); } #endif // if __cplusplus >= 201103L #include #include using namespace std; typedef long long LL; typedef long double LDB; const int kMaxn = 1e5 + 5; int n, a[kMaxn], b[kMaxn]; LL dp[kMaxn]; int Q[kMaxn], QL = 0, QR = 0; int main() { #ifdef local freopen("pro.in", "r", stdin); #endif // ifdef local read(n); for (int i = 1; i <= n; i++) read(a[i]); for (int i = 1; i <= n; i++) read(b[i]); dp[1] = 0; Q[QR++] = 1; for (int i = 2; i <= n; i++) { // while (QR - QL >= 2 && // (dp[Q[QL + 1]] - dp[Q[QL]]) <= // (LL)(-a[i]) * (b[Q[QL + 1]] - b[Q[QL]])) QL++; while (QR - QL >= 2 && LDB(dp[Q[QL + 1]] - dp[Q[QL]]) / LDB(b[Q[QL + 1]] - b[Q[QL]]) >= -a[i]) QL++; int b_j = b[Q[QL]]; LL dp_j = dp[Q[QL]]; dp[i] = dp_j + (LL)a[i] * b_j; // write("dp[", i, "] = ", dp[i], '\n'); // write(char('A' + i - 1), "=(", b[i], ",", dp[i], ")\n"); // while (QR - QL >= 2 && // (dp[i] - dp[Q[QR - 1]]) * (b[Q[QR - 1]] - b[Q[QR - 2]]) >= // (dp[Q[QR - 1]] - dp[Q[QR - 2]]) * (b[i] - b[Q[QR - 1]])) // QR--; while (QR - QL >= 2 && LDB(dp[i] - dp[Q[QR - 1]]) / LDB(b[i] - b[Q[QR - 1]]) >= LDB(dp[Q[QR - 1]] - dp[Q[QR - 2]]) / LDB(b[Q[QR - 1]] - b[Q[QR - 2]])) QR--; Q[QR++] = i; } write(dp[n], '\n'); return 0; }