Advertisement
pb_jiang

CF1213G WA

Sep 26th, 2022
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.04 KB | None | 0 0
  1. #include <assert.h>
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4. #define dbg(...) logger(#__VA_ARGS__, __VA_ARGS__)
  5. template <typename... Args> void logger(string vars, Args &&...values)
  6. {
  7.     cerr << vars << " = ";
  8.     string delim = "";
  9.     (..., (cerr << delim << values, delim = ", "));
  10.     cerr << endl;
  11. }
  12.  
  13. template <class T> using mpq = priority_queue<T, vector<T>, greater<T>>;
  14. using ll = long long;
  15. using pii = pair<int, int>;
  16. using piii = pair<int, pii>;
  17.  
  18. int n, m;
  19. piii es[200003];
  20. pii q[200003];
  21.  
  22. int fa[200003], cnt[200003];
  23. void init(int n)
  24. {
  25.     memset(fa, -1, sizeof(int) * (n + 1));
  26.     for (int i = 0; i <= n + 1; ++i)
  27.         cnt[i] = 1;
  28. }
  29. int find(int x)
  30. {
  31.     if (fa[x] == -1)
  32.         return x;
  33.     int px = find(fa[x]);
  34.     cnt[px] += cnt[x];
  35.     cnt[x] = 0;
  36.     return fa[x] = px;
  37. }
  38. void join(int x, int y)
  39. {
  40.     int px = find(x), py = find(y);
  41.     if (px == py)
  42.         return;
  43.     cnt[px] += cnt[py];
  44.     cnt[py] = 0;
  45.     fa[py] = px;
  46. }
  47.  
  48. int main(int argc, char **argv)
  49. {
  50.     scanf("%d%d", &n, &m);
  51.     init(n);
  52.     mpq<piii> es_pq;
  53.     for (int i = 1; i < n; ++i)
  54.         scanf("%d%d%d", &es[i].second.first, &es[i].second.second, &es[i].first), es_pq.push(es[i]);
  55.  
  56.     for (int i = 1; i <= m; ++i)
  57.         scanf("%d", &q[i].first), q[i].second = i;
  58.     sort(q + 1, q + 1 + m);
  59.  
  60.     vector<ll> ans(m + 1);
  61.     ll acc = 0;
  62.     for (int i = 1; i <= m; ++i) {
  63.         ll round = 0;
  64.         set<int> gp;
  65.         while (es_pq.empty() == false && es_pq.top().first <= q[i].first) {
  66.             auto h = es_pq.top();
  67.             es_pq.pop();
  68.             auto [u, v] = h.second;
  69.             join(u, v);
  70.             gp.insert(u), gp.insert(v);
  71.         }
  72.         set<int> uniq_gp;
  73.         for (auto n : gp)
  74.             uniq_gp.insert(find(n));
  75.         for (auto n : uniq_gp)
  76.             round += ll(cnt[n]) * (cnt[n] - 1) / 2;
  77.         acc = max(acc, round);
  78.         ans[q[i].second] = acc;
  79.     }
  80.     for (int i = 1; i <= m; ++i)
  81.         printf("%lld%c", ans[i], " \n"[i == m]);
  82.     return 0;
  83. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement