Advertisement
jiteshrao

Untitled

Nov 28th, 2020 (edited)
710
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.92 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int N = 1e5 + 5;
  5.  
  6. vector<int> v[N];
  7. int colour[N];
  8. int ret[N];
  9. vector<pair<int, int>> store[N];
  10.  
  11. class DSU
  12. {
  13. public:
  14.     vector<map<int, int>> Maps;
  15.     vector<int> MapID;
  16.     int N;
  17.  
  18.     DSU(int N)
  19.     {
  20.         this -> N = N;
  21.         for(int i = 0; i <= N; i++)
  22.         {
  23.             map<int, int> temp;
  24.             temp[colour[i]] = 1;
  25.             Maps.push_back(temp);
  26.             MapID.push_back(i);
  27.         }
  28.     }
  29.  
  30.     int getPar(int x)
  31.     {
  32.         return MapID[x];
  33.     }
  34.  
  35.     int getSize(int x)
  36.     {
  37.         int par = getPar(x);
  38.         return Maps[par].size();
  39.     }
  40.  
  41.     void unite(int a, int b)
  42.     {
  43.         int par1 = getPar(a);
  44.         int par2 = getPar(b);
  45.         MapID[par2] = par1;
  46.         for(pair<int, int> x : Maps[par2])
  47.         {
  48.             Maps[par1][x.first] += x.second;
  49.         }
  50.     }
  51. };
  52.  
  53. void dfs(DSU & D, int sv, int par)
  54. {
  55.     int maxChild = 0;
  56.     int bigChild = sv;
  57.     for(int x : v[sv])
  58.     {
  59.         if(x == par)
  60.         {
  61.             continue;
  62.         }
  63.         dfs(D, x, sv);
  64.         int sz = D.getSize(x);
  65.         if(maxChild < sz)
  66.         {
  67.             maxChild = sz;
  68.             bigChild = x;
  69.         }
  70.     }
  71.     for(int x : v[sv])
  72.     {
  73.         if(x == par or x == bigChild)
  74.         {
  75.             continue;
  76.         }
  77.         D.unite(bigChild, x);
  78.     }
  79.     if(bigChild != sv)
  80.     {
  81.         D.unite(bigChild, sv);
  82.     }
  83.     for(pair<int, int> x : store[sv])
  84.     {
  85.         ret[x.second] = D.Maps[sv][x.first];
  86.     }
  87. }
  88.  
  89. int32_t main()
  90. {
  91.     ios_base:: sync_with_stdio(false);
  92.     cin.tie(NULL);
  93.     cout.tie(NULL);
  94.     #ifndef ONLINE_JUDGE
  95.       freopen("input.txt", "r", stdin);
  96.       freopen("output.txt", "w", stdout);
  97.     #endif
  98.     int n, root, query;
  99.     cin >> n >> query >> root;
  100.     for(int i = 0; i < n - 1; i++)
  101.     {
  102.         int a, b;
  103.         cin >> a >> b;
  104.         v[a].push_back(b);
  105.         v[b].push_back(a);
  106.     }
  107.     for(int i = 1; i <= n; i++)
  108.     {
  109.         cin >> colour[i];
  110.     }
  111.     DSU D(n);
  112.     for(int i = 1; i <= query; i++)
  113.     {
  114.         int node, colour;
  115.         cin >> node >> colour;
  116.         store[node].push_back({colour, i});
  117.     }
  118.     dfs(D, root, 0);
  119.     for(int i = 1; i <= n; i++)
  120.     {
  121.         cout << ret[i] << " ";
  122.     }
  123. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement