Submission #964356

#TimeUsernameProblemLanguageResultExecution timeMemory
964356sheldonBuilding Bridges (CEOI17_building)C++14
100 / 100
55 ms5712 KiB
#include <bits/stdc++.h> using namespace std; struct line { long long m, b; long long eval (int x) { return m * x + b; } }; struct Node { line ln; Node *lchild, *rchild; Node (line _l) : ln (_l) , lchild (nullptr), rchild (nullptr) {} }; void insert (Node *node, int l, int r, line lnn) { if (l == r) { if (node->ln.eval (l) > lnn.eval (l)) { node->ln = lnn; } return; } int mid = (l + r) / 2; if (node->ln.m > lnn.m) { swap (node->ln, lnn); } if (node->ln.eval (mid) > lnn.eval (mid)) { swap (node->ln, lnn); if (!node->rchild) { node->rchild = new Node (lnn); } else insert (node->rchild, mid + 1, r, lnn); } else { if (!node->lchild) { node->lchild = new Node (lnn); } else insert (node->lchild, l, mid, lnn); } } long long query (Node *node, int l, int r, int x) { if (l == r) { return node->ln.eval (l); } int mid = (l + r) / 2; if (x <= mid) { if (node->lchild) { return min (node->ln.eval (x), query (node->lchild, l, mid, x)); } } else { if (node->rchild) { return min (node->ln.eval (x), query (node->rchild, mid + 1, r, x)); } } return node->ln.eval (x); } void solve() { int n; cin >> n; vector<long long> h (n); for (int i = 0; i < n; ++i) { cin >> h[i]; } int we; cin >> we; line li = line {-2 * h[0], -we + h[0] * h[0]}; Node *root = new Node (li); long long pref = we; long long ans = 2e18; for (int i = 1; i < n; ++i) { cin >> we; pref += we; ans = 1LL * h[i] * h[i] + pref - we + query (root, (int) 0, (int) 1e6, h[i]); insert (root, 0, 1e6, line {-2 * h[i], h[i] * h[i] - pref + ans}); } cout << ans; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...