Advertisement
Guest User

Untitled

a guest
Jul 13th, 2021
149
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.02 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <set>
  4.  
  5. using namespace std;
  6.  
  7. const int N = 1e6 + 228;
  8. const int K = 20;
  9.  
  10. int up[N][K];
  11. int tin[N], h[N];
  12. int timer = 0;
  13.  
  14. vector<int> G[N];
  15.  
  16. void dfs(int v) {
  17.     tin[v] = timer++;
  18.     for (int i : G[v])
  19.         dfs(i);
  20. }
  21.  
  22. int la(int a, int level) {
  23.     for (int i = K - 1; i >= 0; --i) {
  24.         if (level >= (1 << i))
  25.             level -= (1 << i), a = up[a][i];
  26.     }
  27.     return a;
  28. }
  29.  
  30. int lca(int a, int b) {
  31.     if (h[a] > h[b])
  32.         swap(a, b);
  33.     b = la(b, h[b] - h[a]);
  34.     if (a == b)
  35.         return a;
  36.     for (int i = K - 1; i >= 0; --i) {
  37.         if (up[a][i] != up[b][i])
  38.             a = up[a][i], b = up[b][i];
  39.     }
  40.     return up[a][0];
  41. }
  42.  
  43. void solve() {
  44.     int n;
  45.     cin >> n;
  46.     timer = 0;
  47.     for (int i = 0; i <= n; ++i)
  48.         G[i].clear();
  49.  
  50.     G[0].push_back(1);
  51.     up[1][0] = 0, h[1] = 1;
  52.     for (int i = 2; i <= n; ++i) {
  53.         int a;
  54.         cin >> a;
  55.         G[a].push_back(i);
  56.         up[i][0] = a, h[i] = h[a] + 1;
  57.     }
  58.  
  59.     dfs(0);
  60.     for (int k = 1; k < K; ++k) {
  61.         for (int i = 0; i <= n; ++i) {
  62.             up[i][k] = up[up[i][k - 1]][k - 1];
  63.         }
  64.     }
  65.     vector<set<pair<int, int>>> who(n + 1);
  66.     for (int i = 0; i <= n; ++i) {
  67.         who[i].emplace(-1, 0);
  68.         who[i].emplace(n + 3, 0);
  69.     }
  70.  
  71.     cout << 0 << ' ';
  72.     int cnt_leaf = 0;
  73.     long long val = 0;
  74.     vector<int> leaf(n + 1);
  75.     for (int i = 2; i <= n; ++i) {
  76.         auto z = who[h[i]].lower_bound(make_pair(tin[i], i));
  77.         int v = lca(z->second, i), _v = lca((--z)->second, i);
  78.         if (h[_v] > h[v])
  79.             swap(_v, v);
  80.  
  81.         val += 2 * (h[i] - h[v] - 1);
  82.         ++cnt_leaf;
  83.         if (leaf[up[i][0]]) {
  84.             leaf[up[i][0]] = 0;
  85.             --cnt_leaf;
  86.         }
  87.         leaf[i] = 1;
  88.         who[h[i]].emplace(tin[i], i);
  89.         cout << val - i + cnt_leaf << ' ';
  90.     }
  91.     cout << '\n';
  92. }
  93.  
  94. int main() {
  95.     int t;
  96.     cin >> t;
  97.     while (t--)
  98.         solve();
  99. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement