malinaX

centroid

Aug 23rd, 2020
299
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.11 KB | None | 0 0
  1. #include <vector>
  2. #include <algorithm>
  3. #include <iostream>
  4. #include <map>
  5.  
  6. using namespace std;
  7.  
  8. #define f first
  9. #define s second
  10.  
  11. const int MAXN = 2e5 + 3;
  12.  
  13. int ind[MAXN];
  14. int roz[MAXN];
  15. int odw[MAXN];
  16. bool was[MAXN];
  17. long long ans[MAXN];
  18. vector<int> v[MAXN];
  19. map<string, int> mp;
  20. map<int, int> licz;
  21. map<int, int> licz2;
  22. int trn = 0;
  23. int ile;
  24.  
  25. void DFS(int x) {
  26.     odw[x] = trn;
  27.     roz[x] = 1;
  28.     licz[ind[x]]++;
  29.     ile++;
  30.     for (auto &it:v[x]) {
  31.         if (!was[it] && odw[it] != trn) {
  32.             DFS(it);
  33.             roz[x] += roz[it];
  34.         }
  35.     }
  36. }
  37.  
  38. void DFS2(int x) {
  39.     odw[x] = trn;
  40.     licz2[ind[x]]++;
  41.     for (auto &it:v[x]) {
  42.         if (!was[it] && odw[it] != trn)
  43.             DFS2(it);
  44.     }
  45. }
  46.  
  47. void DFS3(int x, long long gle) {
  48.     ans[ind[x]] += (licz[ind[x]] - licz2[ind[x]]) * gle;
  49.     odw[x] = trn;
  50.     for (auto &it:v[x]) {
  51.         if (!was[it] && odw[it] != trn)
  52.             DFS3(it, gle + 1);
  53.     }
  54. }
  55.  
  56. int find_centroid(int x) {
  57.     for (auto &it:v[x]) {
  58.         if (!was[it] && roz[it] > roz[x] / 2) {
  59.             roz[x] -= roz[it];
  60.             roz[it] = ile;
  61.             return find_centroid(it);
  62.         }
  63.     }
  64.     return x;
  65. }
  66.  
  67. void rob(int x) {
  68.     trn++;
  69.     ile = 0;
  70.     licz.clear();
  71.     DFS(x);
  72.     int centroid = find_centroid(x);
  73.     was[centroid] = true;
  74.     for (auto &it:v[centroid]) {
  75.         if (!was[it]) {
  76.             licz2.clear();
  77.             trn++;
  78.             DFS2(it);
  79.             trn++;
  80.             DFS3(it, 1);
  81.         }
  82.     }
  83.     for (auto &it:v[centroid]) {
  84.         if (!was[it])
  85.             rob(it);
  86.     }
  87. }
  88.  
  89. int main() {
  90.     ios_base::sync_with_stdio(false);
  91.     cin.tie(nullptr);
  92.     int n, x, y;
  93.     string ss;
  94.     cin >> n;
  95.     for (int i = 1; i < n; i++) {
  96.         cin >> x >> y;
  97.         v[x].push_back(y);
  98.         v[y].push_back(x);
  99.     }
  100.     int cnt = 0;
  101.     for (int i = 1; i <= n; i++) {
  102.         cin >> ss;
  103.         if (!mp[ss])
  104.             mp[ss] = ++cnt;
  105.         ind[i] = mp[ss];
  106.     }
  107.     rob(1);
  108.     for (auto &it:mp)
  109.         printf("%lld\n", ans[it.s]);
  110.     return 0;
  111. }
Add Comment
Please, Sign In to add comment