4eyes4u

Set-merging

Sep 21st, 2016
189
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.03 KB | None | 0 0
  1. /*
  2. Broj razlicitih vrednosti u podstablu svakog cvora
  3. O(Nlog^2N)
  4. set-merging
  5. */
  6.  
  7. #include <bits/stdc++.h>
  8. using namespace std;
  9.  
  10. const int N=1e5+10;
  11.  
  12. struct Node
  13. {
  14.     int val;
  15.     vector<int> adj;
  16. } g[N];
  17.  
  18. int n, sol[N], aux[N];
  19. set<int> skup[N];
  20. int p[N];
  21.  
  22. int unite (int a, int b)
  23. {
  24.     if (skup[a].size()<skup[b].size()) swap (a, b);
  25.     for (auto xt: skup[b]) skup[a].insert(xt);
  26.     aux[a]=skup[a].size();
  27.  
  28.     return a;
  29. }
  30.  
  31. void dfs (int v, int prev)
  32. {
  33.     p[v]=v;
  34.     aux[v]=1;
  35.     skup[v].insert(g[v].val);
  36.  
  37.     for (auto xt: g[v].adj)
  38.     {
  39.         if (xt==prev) continue;
  40.         dfs (xt, v);
  41.         p[v]=unite (p[v], p[xt]);
  42.     }
  43.  
  44.     sol[v]=aux[p[v]];
  45. }
  46.  
  47. int main()
  48. {
  49.     scanf ("%d", &n);
  50.     for (int i=1;i<=n;i++) scanf ("%d", &g[i].val);
  51.     for (int i=1;i<n;i++)
  52.     {
  53.         int a, b;
  54.         scanf ("%d%d", &a, &b);
  55.         g[a].adj.push_back(b);
  56.         g[b].adj.push_back(a);
  57.     }
  58.  
  59.     dfs (1, 0);
  60.  
  61.     for (int i=1;i<=n;i++) printf ("%d ", sol[i]);
  62.  
  63.     return 0;
  64. }
Advertisement
Add Comment
Please, Sign In to add comment