Submission #705153

#TimeUsernameProblemLanguageResultExecution timeMemory
705153finn__Harbingers (CEOI09_harbingers)C++17
0 / 100
184 ms25472 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; } }; #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) { if (!q.empty()) { size_t a = 0, b = q.size() - 1; while (a < b) { size_t mid = (a + b + 1) / 2; if (mid < q.size() - 1 && q[mid](v[u]) <= q[mid + 1](v[u])) a = mid; else b = mid - 1; } ans[u] = q[a](v[u]) + d[u] * v[u] + s[u]; 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(); } 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...