Advertisement
Guest User

CEOI 2009 Harbingers

a guest
Mar 4th, 2021
323
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.44 KB | None | 0 0
  1. // CEOI 2009 Harbingers
  2. // https://oj.uz/problem/view/CEOI09_harbingers
  3.  
  4. #include <iostream>
  5. #include <algorithm>
  6. #include <vector>
  7. #include <map>
  8. #include <set>
  9. #include <array>
  10. #include <stack>
  11. #include <queue>
  12. #include <random>
  13. #include <numeric>
  14. #include <functional>
  15. #include <chrono>
  16. #include <utility>
  17. #include <iomanip>
  18. #include <assert.h>
  19.  
  20. using namespace std;
  21.  
  22. void dbg_out() { cerr << endl; }
  23. template<typename Head, typename... Tail>
  24. void dbg_out(Head H, Tail... T) { cerr << ' ' << H; dbg_out(T...); }
  25. #define dbg(...) cerr << "(" << #__VA_ARGS__ << "):", dbg_out(__VA_ARGS__)
  26.  
  27. #define rng_init mt19937 rng(chrono::steady_clock::now().time_since_epoch().count())
  28. #define rng_seed(x) mt19937 rng(x)
  29. #define all(x) (x).begin(), (x).end()
  30. #define sz(x) (int) (x).size()
  31. #define int int64_t
  32.  
  33. const int MXN = 1e5 + 5, INF = 1e18;
  34. vector<pair<int, int>> g[MXN];
  35. int S[MXN], V[MXN], version[MXN], ans[MXN];
  36. int last_version;
  37.  
  38. struct Line {
  39.     int m, c;
  40.  
  41.     Line() {
  42.         m = 0;
  43.         c = INF;
  44.     }
  45.  
  46.     Line(int m, int c) : m(m), c(c) {}
  47.  
  48.     int val(int x) { return m * x + c; }
  49. };
  50.  
  51. struct Node {
  52.     Line line;
  53.     Node *lc, *rc;
  54.  
  55.     Node() : lc(0), rc(0) {}
  56. };
  57.  
  58. deque<Node> buffer;
  59. deque<Node*> root;
  60.  
  61. Node* new_node() {
  62.     buffer.emplace_back();
  63.     return &buffer.back();
  64. }
  65.  
  66. void modify(Node* &prev, Node* &cur, int l, int r, Line new_line) {
  67.     if (!prev) {
  68.         cur->line = new_line;
  69.         return;
  70.     }
  71.  
  72.     cur->line = prev->line;
  73.  
  74.     if (r - l <= 0) return;
  75.  
  76.     cur->lc = prev->lc;
  77.     cur->rc = prev->rc;
  78.  
  79.     int mid = l + (r - l) / 2;
  80.  
  81.     if (new_line.val(mid) < cur->line.val(mid))
  82.         swap(cur->line, new_line);
  83.  
  84.     if (new_line.val(l) < cur->line.val(l)) {
  85.         cur->lc = new_node();
  86.         modify(prev->lc, cur->lc, l, mid, new_line);
  87.     } else {
  88.         cur->rc = new_node();
  89.         modify(prev->rc, cur->rc, mid + 1, r, new_line);
  90.     }
  91. }
  92.  
  93. int query(Node* &cur, int l, int r, int x) {
  94.     if (!cur) return INF;
  95.  
  96.     int res = cur->line.val(x);
  97.     if (r - l <= 0) return res;
  98.  
  99.     int mid = l + (r - l) / 2;
  100.     if (x <= mid) return min(res, query(cur->lc, l, mid, x));
  101.     else return min(res, query(cur->rc, mid + 1, r, x));
  102. }
  103.  
  104. void modify(int modify_version, int m, int c) {
  105.     root.emplace_back(new_node());
  106.     modify(root[modify_version], root[last_version], 0, 1000000000, Line(m, c));
  107. }
  108.  
  109. int query(int qry_version, int x) {
  110.     return query(root[qry_version], 0, 1000000000, x);
  111. }
  112.  
  113. void dfs(int u, int p, int dist) {
  114.     version[u] = ++last_version;
  115.  
  116.     ans[u] = min(dist * V[u] + S[u], query(version[p], V[u]) + dist * V[u] + S[u]);
  117.     modify(version[p], -dist, ans[u]);
  118.  
  119.     for (const auto &[v, d] : g[u]) {
  120.         if (v == p) continue;
  121.         dfs(v, u, dist + d);
  122.     }
  123. }
  124.  
  125. void solve() {
  126.     int N;
  127.     cin >> N;
  128.  
  129.     for (int i = 0; i < N - 1; i++) {
  130.         int u, v, d;
  131.         cin >> u >> v >> d;
  132.  
  133.         g[u].emplace_back(v, d);
  134.         g[v].emplace_back(u, d);
  135.     }
  136.  
  137.     for (int i = 2; i <= N; i++)
  138.         cin >> S[i] >> V[i];
  139.  
  140.     root.emplace_back(new_node());
  141.     buffer[0].line.c = 0;
  142.     version[1] = 0;
  143.  
  144.     for (const auto &[v, d] : g[1]) {
  145.         dfs(v, 1, d);
  146.     }
  147.  
  148.     for (int i = 2; i <= N; i++)
  149.         cout << ans[i] << " ";
  150. }
  151.  
  152. signed main() {
  153.     ios_base::sync_with_stdio(false);
  154.     cin.tie(nullptr);
  155.  
  156.     int TC = 1;
  157.     // cin >> TC;
  158.     while (TC--) solve();
  159. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement