Submission #705169

#TimeUsernameProblemLanguageResultExecution timeMemory
705169finn__Harbingers (CEOI09_harbingers)C++17
70 / 100
1090 ms29716 KiB
#include <bits/stdc++.h> using namespace std; struct LinearFn { int64_t m, t; LinearFn(int64_t m_, int64_t t_) { m = m_, t = t_; } int64_t operator()(int64_t x) { return m * x + t; } }; bool intersects_earlier(LinearFn f, LinearFn g, LinearFn h) { return (double)(h.t - f.t) / (double)(f.m - h.m) < (double)(g.t - f.t) / (double)(f.m - g.m); } #define N 100000 int64_t s[N], v[N], d[N], ans[N]; vector<pair<size_t, int64_t>> g[N]; void find_shortest_route(size_t u, size_t p, deque<LinearFn> &q) { vector<LinearFn> removed; if (!q.empty()) { size_t a = 0, b = q.size() - 1; while (a < b) { size_t mid = (a + b) / 2; if (mid < q.size() - 1) { if (q[mid](v[u]) <= q[mid + 1](v[u])) b = mid; else a = mid + 1; } else { if (mid && q[mid - 1](v[u]) <= q[mid](v[u])) b = mid - 1; else a = mid; } } ans[u] = q[a](v[u]) + d[u] * v[u] + s[u]; LinearFn f(-d[u], ans[u]); while (q.size() >= 2 && intersects_earlier(*(q.rbegin() + 1), *q.rbegin(), f)) { removed.push_back(q.back()); q.pop_back(); } q.emplace_back(-d[u], ans[u]); } else { q.emplace_back(0, 0); } for (auto [x, w] : g[u]) { if (x != p) { d[x] = d[u] + w; find_shortest_route(x, u, q); } } q.pop_back(); for (auto it = removed.rbegin(); it != removed.rend(); it++) q.push_back(*it); } int main() { size_t n; cin >> n; for (size_t i = 0; i + 1 < n; i++) { size_t u, v, w; cin >> u >> v >> w; g[u - 1].emplace_back(v - 1, w); g[v - 1].emplace_back(u - 1, w); } for (size_t i = 1; i < n; i++) cin >> s[i] >> v[i]; deque<LinearFn> q; find_shortest_route(0, SIZE_MAX, q); for (size_t i = 1; i < n; i++) cout << ans[i] << ' '; cout << '\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...