jiteshrao

Untitled

Nov 28th, 2020 (edited)
648
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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. }
RAW Paste Data

Adblocker detected! Please consider disabling it...

We've detected AdBlock Plus or some other adblocking software preventing Pastebin.com from fully loading.

We don't have any obnoxious sound, or popup ads, we actively block these annoying types of ads!

Please add Pastebin.com to your ad blocker whitelist or disable your adblocking software.

×