Wednesday, February 13, 2019

[Codeforces] E. Lomsat gelral

Author            : Dipu Kumar Mohanto 
                    CSE, Batch - 6
                    BRUR.
Problem Statement : E. Lomsat gelral
Source            : Codeforces
Category          : Graph Theory
Algorithm         : Union By Rank
Verdict           : Accepted

  1. #include "bits/stdc++.h"  
  2.   
  3. using namespace std;  
  4.   
  5. #define ll            long long  
  6. #define sz(a)         (int)a.size()  
  7.   
  8. static const int maxn = 2e5 + 5;  
  9.   
  10. vector <int> graph[maxn];  
  11. ll color[maxn];  
  12. map <ll, ll> mapper[maxn]; // mapper[ parent node ][ color ] = occurrence for node u  
  13. ll maxOcc[maxn];           // maximum occurrence in node u  
  14. ll cnt[maxn];  
  15. ll ans[maxn];  
  16. int p[maxn];  
  17.   
  18. void marge(int a, int b)  
  19. {  
  20.     if (sz(mapper[ p[a] ]) < sz(mapper[ p[b] ])) swap(p[a], p[b]);  
  21.     int id = p[a];  
  22.     for (auto it : mapper[ p[b] ])  
  23.     {  
  24.         ll col = it.first;  
  25.         ll occ = it.second;  
  26.         mapper[id][col] += occ;  
  27.         if (mapper[id][col] > maxOcc[id])  
  28.         {  
  29.             maxOcc[id] = mapper[id][col];  
  30.             cnt[id] = col;  
  31.         }  
  32.         else if (mapper[id][col] == maxOcc[id])  
  33.         {  
  34.             cnt[id] += col;  
  35.         }  
  36.     }  
  37. }  
  38.   
  39. void dfs(int u = 1, int par = -1)  
  40. {  
  41.     for (int v : graph[u])  
  42.     {  
  43.         if (v == par) continue;  
  44.         dfs(v, u);  
  45.         marge(u, v);  
  46.     }  
  47.     ans[u] = cnt[ p[u] ];  
  48. }  
  49.   
  50. int main()  
  51. {  
  52.     //freopen("in.txt", "r", stdin);  
  53.   
  54.     int tnode;  
  55.     scanf("%d", &tnode);  
  56.     for (int i = 1; i <= tnode; i++)  
  57.     {  
  58.         scanf("%lld", color+i);  
  59.         mapper[i][ color[i] ] = 1;  
  60.         maxOcc[i] = 1;  
  61.         cnt[i] = color[i];  
  62.         p[i] = i;  
  63.     }  
  64.     for (int e = 1; e < tnode; e++)  
  65.     {  
  66.         int u, v;  
  67.         scanf("%d %d", &u, &v);  
  68.         graph[u].emplace_back(v);  
  69.         graph[v].emplace_back(u);  
  70.     }  
  71.     dfs();  
  72.     for (int i = 1; i <= tnode; i++) printf("%lld ", ans[i]);  
  73. }  

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.