Submission #1113082

#TimeUsernameProblemLanguageResultExecution timeMemory
1113082available3124Building Bridges (CEOI17_building)C++14
100 / 100
87 ms11336 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define int long long const int maxn = 2e5; struct convex_hull { struct Line { bool type; double x; int m, c; const bool operator<(const Line &l) const { if (type || l.type) { return x < l.x; } return m > l.m; } }; set<Line> cht; bool has_prev(set<Line>::iterator t) { return t != cht.begin(); } bool has_next(set<Line>::iterator t) { return t != cht.end() && next(t) != cht.end(); } double interect(set<Line>::iterator l1, set<Line>::iterator l2) { return (double)(l1->c - l2->c) / (l2->m - l1->m); } void calc_x(set<Line>::iterator t) { if (has_prev(t)) { Line l = *t; l.x = interect(prev(t), t); cht.insert(cht.erase(t), l); } } bool bad(set<Line>::iterator t) { if (has_next(t) && next(t)->c <= t->c) return true; return (has_prev(t) && has_next(t) && interect(prev(t), next(t)) <= interect(prev(t), t)); } void add_line(ll m, ll c) { set<Line>::iterator it; it = cht.lower_bound({0, 0, m, c}); if (it != cht.end() && it->m == m) { if (it->c <= c) { return; } cht.erase(it); } it = cht.insert({0, 0, m, c}).first; if (bad(it)) { cht.erase(it); } else { while (has_prev(it) && bad(prev(it))) cht.erase(prev(it)); while (has_next(it) && bad(next(it))) cht.erase(next(it)); if (has_next(it)) { calc_x(next(it)); } calc_x(it); } } int query(int h) { Line l = *prev(cht.upper_bound({1, (double)h, 0, 0})); return l.m * h + l.c; } }; struct Rect { int x, y; const bool operator<(const Rect &r) { return x < r.x || (x == r.x && y > r.y); } }; signed main() { ios_base::sync_with_stdio(0); cin.tie(0); int n, tot = 0; cin >> n; vector<int> h(n + 1); for (int i = 1; i <= n; i++) cin >> h[i]; vector<int> w(n + 1); vector<int> dp(n + 1); for (int i = 1; i <= n; i++) { cin >> w[i]; tot += w[i]; } dp[1] = -w[1]; convex_hull cht; for (int i = 2; i <= n; i++) { cht.add_line(-2 * h[i - 1], dp[i - 1] + h[i - 1] * h[i - 1]); dp[i] = cht.query(h[i]) - w[i] + h[i] * h[i]; } cout << tot + dp[n]; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...