Advertisement
slash0t

123

Mar 17th, 2025
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.01 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #define _USE_MATH_DEFINES
  3.  
  4. #include <iostream>
  5. #include <cmath>
  6. #include <algorithm>
  7. #include <fstream>
  8. #include <set>
  9. #include <vector>
  10. #include <map>
  11. #include <queue>
  12. #include <stack>
  13. #include <string>
  14. #include <cstring>
  15. #include <unordered_set>
  16. #include <unordered_map>
  17. #include <random>
  18. #include <chrono>
  19. #include <ctime>
  20. #include <complex>
  21. #include <bitset>
  22.  
  23. using namespace std;
  24.  
  25. #define int long long
  26. #define ld long double
  27. #define nl "\n"
  28. #define pb push_back
  29. #define xx first
  30. #define yy second
  31. #define cinn(a) for (int i = 0; i < (int) a.size(); i++) cin >> a[i];
  32. #define coutt(a) for (int i = 0; i < (int) a.size(); i++) cout << a[i] << (i == a.size() - 1 ? nl : " ");
  33. #define sortt(a) sort(a.begin(), a.end());
  34. #define rev(a) reverse(a.begin(), a.end());
  35. #define hi(a) (--a.end())
  36. #define lo(a) a.begin()
  37. #define ll(a) int a; cin >> a;
  38. #define vi(a, n) vector<int> a(n); cinn(a);
  39. #define forn(i, n) for (int i = 0; i < n; i++)
  40. #define nfor(i, n) for (int i = n; i >= 0; i--)
  41. #define foreach(i, st) for (auto & i : st)
  42.  
  43. const int inf = 1e15 + 7;
  44. const int N = 2e5 + 69;
  45. const int M = 998244353;
  46.  
  47. vector<pair<int, int>> g[N];
  48. int lca[N][20];
  49. int lcaW[N][20];
  50. int depth[N];
  51.  
  52. void dfs(int now, int last, int lastW, int d) {
  53.     lca[now][0] = last;
  54.     lcaW[now][0] = lastW;
  55.     depth[now] = d;
  56.  
  57.     for (auto p : g[now]) {
  58.         if (p.xx == last) continue;
  59.         dfs(p.xx, now, p.yy, d + 1);
  60.     }
  61. }
  62.  
  63. int lcaweight(int a, int b) {
  64.     if (depth[a] < depth[b]) swap(a, b);
  65.     int dist = 0;
  66.     for (int i = 19; i >= 0; i--) {
  67.         if (depth[lca[a][i]] < depth[b]) continue;
  68.         dist = max(dist, lcaW[a][i]);
  69.         a = lca[a][i];
  70.     }
  71.  
  72.     if (a == b) {
  73.         return dist;
  74.     }
  75.  
  76.     for (int i = 19; i >= 0; i--) {
  77.         if (lca[a][i] == lca[b][i]) continue;
  78.         dist = max(dist, max(lcaW[a][i], lcaW[b][i]));
  79.         a = lca[a][i];
  80.         b = lca[b][i];
  81.     }
  82.  
  83.     dist = max(dist, max(lcaW[a][0], lcaW[b][0]));
  84.     return dist;
  85. }
  86.  
  87. void solve() {
  88.     ll(n); ll(m);
  89.     forn(i, n - 1) {
  90.         ll(u); ll(v); ll(c);
  91.         u--;v--;
  92.         g[v].pb({ u, c });
  93.         g[u].pb({ v, c });
  94.     }
  95.  
  96.     vi(path, m);
  97.  
  98.     dfs(0, -1, 0, 0);
  99.  
  100.     for (int i = 1; i < 20; i++) {
  101.         for (int j = 0; j < n; j++) {
  102.             lcaW[j][i] = max(lcaW[j][i - 1], lcaW[lca[j][i - 1]][i - 1]);
  103.             lca[j][i] = lca[lca[j][i - 1]][i - 1];
  104.         }
  105.     }
  106.  
  107.     forn(i, m) path[i]--;
  108.     int res = 0;
  109.     for (int i = 1; i < m; i++) {
  110.         res += lcaweight(path[i], path[i - 1]);
  111.     }
  112.     cout << res << nl;
  113. }
  114.  
  115. signed main()
  116. {
  117.     //freopen("magic.in", "r", stdin);
  118.     //freopen("magic.out", "w", stdout);
  119. #ifdef _DEBUG
  120.     freopen("input.txt", "r", stdin);
  121.     freopen("output.txt", "w", stdout);
  122.     int start = chrono::high_resolution_clock::now().time_since_epoch().count();
  123. #endif
  124.     ios_base::sync_with_stdio(0);
  125.     cin.tie(0);
  126.     cout.tie(0);
  127.     cout << fixed;
  128.     cout.precision(10);
  129.  
  130.     int tests = 1;
  131.     //cin >> tests;
  132.     while (tests--) solve();
  133.  
  134. #ifdef _DEBUG
  135.     cout << nl << "TIME ms: ";
  136.     cout << (chrono::high_resolution_clock::now().time_since_epoch().count() - start) / 1e6 << nl;
  137. #endif
  138.     return 0;
  139. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement