Submission #704212

#TimeUsernameProblemLanguageResultExecution timeMemory
704212finn__Building Bridges (CEOI17_building)C++17
100 / 100
43 ms11544 KiB
#include <bits/stdc++.h> using namespace std; template <typename T> struct LinearFn { T m, t; LinearFn() {} LinearFn(T m_, T t_) { m = m_, t = t_; } T operator()(T x) const { return m * x + t; } }; template <typename T> struct LiChaoNode { LiChaoNode<T> *left, *right; LinearFn<T> f; LiChaoNode() { left = right = 0; // If function values go higher, change the default maximum. f = LinearFn<T>(0, numeric_limits<T>::max() / 4); } void insert(LinearFn<T> g, T l, T r) { T mid = (l + r) / 2; if (g(mid) < f(mid)) swap(f, g); if (r - l == 1) return; if ((f(l) < g(l)) ^ (f(mid) < g(mid))) { if (!left) left = new LiChaoNode(); left->insert(g, l, (l + r) / 2); } else { if (!right) right = new LiChaoNode(); right->insert(g, (l + r) / 2, r); } } T get_min(T x, T l, T r) { T y = f(x); if (left && x < (l + r) / 2) y = min(y, left->get_min(x, l, (l + r) / 2)); if (right && x >= (l + r) / 2) y = min(y, right->get_min(x, (l + r) / 2, r)); return y; } void destroy() { if (left) left->destroy(); if (right) right->destroy(); delete left; delete right; } }; #define N 100000 #define H (1 << 21) int64_t h[N], w[N]; int main() { ios_base::sync_with_stdio(0); cin.tie(0); size_t n; cin >> n; int64_t wsum = 0; for (size_t i = 0; i < n; i++) cin >> h[i]; for (size_t i = 0; i < n; i++) cin >> w[i], wsum += w[i]; LiChaoNode<int64_t> root; root.insert(LinearFn<int64_t>(-2 * h[0], h[0] * h[0] - w[0]), 0, H); for (size_t i = 1; i < n; i++) { int64_t y = root.get_min(h[i], 0, H); LinearFn<int64_t> g(-2 * h[i], y + 2 * h[i] * h[i] - w[i]); root.insert(g, 0, H); if (i == n - 1) cout << wsum + g.t - h[i] * h[i] << '\n'; } root.destroy(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...