Advertisement
pb_jiang

CF915F TLE

May 5th, 2023
154
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.91 KB | None | 0 0
  1. // Problem: F. Imbalance Value of a Tree
  2. // Contest: Codeforces - Educational Codeforces Round 36 (Rated for Div. 2)
  3. // URL: https://codeforces.com/problemset/problem/915/F
  4. // Memory Limit: 256 MB
  5. // Time Limit: 4000 ms
  6. //
  7. // Powered by CP Editor (https://cpeditor.org)
  8.  
  9. #include <assert.h>
  10. #include <bits/stdc++.h>
  11. using namespace std;
  12.  
  13. template <class T> using mpq = priority_queue<T, vector<T>, greater<T>>;
  14.  
  15. using ll = long long;
  16. using pii = pair<int, int>;
  17. using pll = pair<ll, ll>;
  18. using vl = vector<ll>;
  19. using vi = vector<int>;
  20.  
  21. int n;
  22. vector<pii> a;
  23.  
  24. ll maxv, minv;
  25.  
  26. int fa[1000003], cnt[1000003];
  27. void init_dsu()
  28. {
  29.     memset(fa, -1, sizeof(fa));
  30.     fill_n(cnt, sizeof(cnt) / sizeof(int), 1);
  31. }
  32. int find(int x)
  33. {
  34.     if (fa[x] == -1)
  35.         return x;
  36.     return fa[x] = find(fa[x]);
  37. }
  38. void join(int x, int y)
  39. {
  40.     int px = find(x), py = find(y);
  41.     if (px != py) {
  42.         fa[px] = py;
  43.         cnt[py] += cnt[px];
  44.         cnt[px] = 0;
  45.     }
  46. }
  47. using a3i = array<int, 3>;
  48. void bucket_sort(vector<a3i> &v, int dir)
  49. {
  50.     vector<a3i> ori(v);
  51.     vector<int> lo[1024], hi[1024];
  52.     int mask = (1 << 10) - 1;
  53.     for (int i = 0; i < v.size(); ++i)
  54.         lo[v[i][0] & mask].push_back(i);
  55.     for (int i = 0; i < 1024; ++i)
  56.         for (auto idx : lo[i])
  57.             hi[v[idx][0] >> 10].push_back(idx);
  58.  
  59.     int pos = 0;
  60.     for (int i = 0; i < 1024; ++i)
  61.         for (auto idx : hi[i])
  62.             v[pos++] = ori[idx];
  63.     if (dir == 1)
  64.         reverse(v.begin(), v.end());
  65. }
  66.  
  67. int main(int argc, char **argv)
  68. {
  69.     cin >> n;
  70.     a = vector<pii>(n);
  71.     for (int i = 0; i < n; ++i)
  72.         cin >> a[i].first, a[i].second = i + 1;
  73.  
  74.     vector<pii> edges(n - 1);
  75.     vector<a3i> es(n - 1);
  76.     for (int i = 0; i < n - 1; ++i)
  77.         cin >> edges[i].first >> edges[i].second;
  78.  
  79.     init_dsu();
  80.     // sort(a.begin(), a.end());
  81.     for (int i = 0; i < n - 1; ++i)
  82.         es[i][1] = edges[i].first, es[i][2] = edges[i].second,
  83.         es[i][0] = max(a[es[i][1] - 1].first, a[es[i][2] - 1].first);
  84.     // sort(es.begin(), es.end());
  85.     bucket_sort(es, 0);
  86.     for (int i = 0; i < n - 1; ++i) {
  87.         int u = es[i][1], v = es[i][2];
  88.         ll w = es[i][0];
  89.         int up = find(u), vp = find(v);
  90.         int usize = cnt[up], vsize = cnt[vp];
  91.         join(up, vp);
  92.         maxv += w * usize * vsize;
  93.     }
  94.  
  95.     init_dsu();
  96.     for (int i = 0; i < n - 1; ++i)
  97.         es[i][1] = edges[i].first, es[i][2] = edges[i].second,
  98.         es[i][0] = min(a[es[i][1] - 1].first, a[es[i][2] - 1].first);
  99.     // sort(es.rbegin(), es.rend());
  100.     bucket_sort(es, 1);
  101.     for (int i = 0; i < n - 1; ++i) {
  102.         int u = es[i][1], v = es[i][2];
  103.         ll w = es[i][0];
  104.  
  105.         int up = find(u), vp = find(v);
  106.         int usize = cnt[up], vsize = cnt[vp];
  107.         join(up, vp);
  108.         minv += w * usize * vsize;
  109.     }
  110.  
  111.     cout << maxv - minv << endl;
  112.  
  113.     return 0;
  114. };
  115.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement