Advertisement
fooker

distinct colors cses

Feb 11th, 2024
962
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.38 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4.  
  5. const ll nmax = 1e9+7;
  6. const ll nmax2 = 998244353;
  7.  
  8. int main(){
  9.     std::ios_base::sync_with_stdio(false);
  10.     std::cin.tie(0);
  11.     std::cout.tie(0);
  12.  
  13.     ll n;
  14.     std::cin >> n;
  15.  
  16.     ll c[n + 1];
  17.     for (ll i = 1; i <= n; i++) std::cin >> c[i];
  18.  
  19.     std::vector<ll> adj[n + 1];
  20.     for (ll i = 1, x, y; i < n; i++){
  21.         std::cin >> x >> y;
  22.         adj[x].push_back(y);
  23.         adj[y].push_back(x);
  24.     }
  25.  
  26.     std::set<ll> s[n + 1];
  27.     std::function<void(ll, ll)> dfs = [&] (ll u, ll p){
  28.         std::vector<std::pair<ll, ll>> child;
  29.         for (auto v: adj[u]){
  30.             if (v != p){
  31.                 dfs(v, u);
  32.                 child.push_back({s[v].size(), v});
  33.             }
  34.         }  
  35.         if (child.size()){
  36.             std::sort(child.begin(), child.end());
  37.             std::reverse(child.begin(), child.end());
  38.         }
  39.         if (child.size()){
  40.             s[u] = s[child[0].second];
  41.             if (child.size() > 1){
  42.                 for (ll i = 1; i < child.size(); i++){
  43.                     for (auto v: s[child[i].second]){
  44.                         s[u].insert(v);
  45.                     }
  46.                 }
  47.             }
  48.         }
  49.         s[u].insert(c[u]);
  50.     };  
  51.  
  52.     dfs(1, 0);
  53.  
  54.     for (ll i = 1; i <= n; i++){
  55.         std::cout << s[i].size() << ' ';
  56.     }
  57. }
  58.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement