Advertisement
Kevin_Zhang

Untitled

Apr 25th, 2020
642
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.93 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. using ll = long long;
  4. #define pb emplace_back
  5. const int maxn = 1e6+10, inf = 1e9;
  6. #define int ll
  7. int n, q;
  8. vector<pair<int,int>> edge[maxn];
  9. int a[maxn], b[maxn];
  10. ll sum[maxn];
  11.  
  12. ll _cost;
  13. int x[maxn], y[maxn];
  14. void dfs(int now, int last = -1) {
  15.     sum[now] = a[now];
  16.     for (auto [u, w] : edge[now]) if (u != last) {
  17.         dfs(u, now);
  18.         sum[now] += sum[u];
  19.         _cost += abs(sum[u]) * w;
  20.     }
  21.     if (!last) assert(sum[now] == 0);
  22. }
  23. ll cal(int x, int y, ll m) {
  24.     _cost = 0;
  25.     a[x] += m, a[y] -= m;
  26.     dfs(1);
  27.     a[x] -= m, a[y] += m;
  28.     return _cost;
  29. }
  30.  
  31. ll cost(ll m) {
  32.     if (m == 0) return cal(0, 0, 0);
  33.     ll res = -1;
  34.     for (int i = 0;i < q;++i)
  35.         res = max(res, min(cal(x[i], y[i], m), cal(y[i], x[i], m)));
  36.     assert(res != -1);
  37.     return res;
  38. }
  39. void solve() {
  40.     ll res = cost(0), pos = 0, c0 = res;
  41.     for (int i = 1;i <= 1000;++i) {
  42.         ll v = cost(i);
  43.         if (v < res)
  44.             res = v, pos = i;
  45.     }
  46.     cout << pos << ' ' << c0 - res << '\n';
  47. }
  48. signed main() {
  49.     ios_base::sync_with_stdio(0), cin.tie(0);
  50.     cin >> n >> q;
  51.     for (int i = 1, a, b, w;i < n;++i) {
  52.         cin >> a >> b >> w;
  53.         edge[a].pb(b, w);
  54.         edge[b].pb(a, w);
  55.     }
  56.     for (int i = 1;i <= n;++i)
  57.         cin >> a[i] >> b[i], a[i] -= b[i];
  58.     for (int i = 0;i < q;++i)
  59.         cin >> x[i] >> y[i];
  60.  
  61.     solve();
  62.     return 0;
  63.     ll l = 0, r = 2e9, m;
  64.     ll res = cost(0), c0 = res;
  65. //  for (int i = 0;i <= 100;++i)
  66. //      cout << cost(i) << '\n';
  67. //  return 0;
  68. //  for (int i = 0;;++i) {
  69. //      ll v = cost(i+1);
  70. //      if (v > res)
  71. //          break;
  72. //      if (v < res)
  73. //          res = v, l = i+1;
  74. //  }
  75.     while (l < r) {
  76.         m = l + r >> 1;
  77.         ll a = cost(m), b = cost(m+1);
  78.         res = min(res, min(a, b));
  79.         if (a <= b) r = m;
  80.         else l = m+1;
  81.     }
  82.     assert(res <= c0);
  83. //  assert(cost(2e9) >= res);
  84. //  assert(l < inf);
  85.     assert(l == 0 || cost(l-1) > cost(l));
  86.     assert(cost(l) == res);
  87.     cout << l << ' ' << c0-res << '\n';
  88. }
  89. /*
  90. 4 1
  91. 1 2 1
  92. 2 3 1
  93. 3 4 1
  94. 1 0
  95. 0 1
  96. 0 0
  97. 0 0
  98. 3 4
  99. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement