Advertisement
pb_jiang

CF915F TLE

May 5th, 2023
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.25 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. vi g[1000003];
  23. vector<pii> a;
  24.  
  25. ll maxv, minv;
  26.  
  27. int fa[1000003], cnt[1000003];
  28. void init_dsu()
  29. {
  30.     memset(fa, -1, sizeof(fa));
  31.     fill_n(cnt, sizeof(cnt) / sizeof(int), 1);
  32. }
  33. int find(int x)
  34. {
  35.     if (fa[x] == -1)
  36.         return x;
  37.     return fa[x] = find(fa[x]);
  38. }
  39. void join(int x, int y)
  40. {
  41.     int px = find(x), py = find(y);
  42.     if (px != py) {
  43.         fa[px] = py;
  44.         cnt[py] += cnt[px];
  45.         cnt[px] = 0;
  46.     }
  47. }
  48.  
  49. int main(int argc, char **argv)
  50. {
  51.     cin >> n;
  52.     a = vector<pii>(n);
  53.     for (int i = 0; i < n; ++i)
  54.         cin >> a[i].first, a[i].second = i + 1;
  55.  
  56.     for (int i = 1; i < n; ++i) {
  57.         int a, b;
  58.         cin >> a >> b;
  59.         g[a].push_back(b), g[b].push_back(a);
  60.     }
  61.     init_dsu();
  62.     sort(a.begin(), a.end());
  63.     set<int> exist;
  64.     for (int i = 0; i < n; ++i) {
  65.         int u = a[i].second;
  66.         ll w = a[i].first;
  67.         exist.insert(u);
  68.         for (auto v : g[u])
  69.             if (exist.count(v)) {
  70.                 int gp = find(v);
  71.                 int gsize = cnt[gp];
  72.                 int usize = cnt[u];
  73.                 join(gp, u);
  74.                 maxv += w * gsize * usize;
  75.             }
  76.     }
  77.  
  78.     init_dsu();
  79.     exist.clear();
  80.     sort(a.rbegin(), a.rend());
  81.     for (int i = 0; i < n; ++i) {
  82.         int u = a[i].second;
  83.         ll w = a[i].first;
  84.         exist.insert(u);
  85.         for (auto v : g[u]) {
  86.             if (exist.count(v)) {
  87.                 int gp = find(v);
  88.                 int gsize = cnt[gp];
  89.                 int usize = cnt[u];
  90.                 join(gp, u);
  91.                 minv += w * gsize * usize;
  92.             }
  93.         }
  94.     }
  95.  
  96.     cout << maxv - minv << endl;
  97.  
  98.     return 0;
  99. };
  100.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement