0w1

IOICJ 77 Lowest Common Ancestor ( DFS )

Problem Description:
Node 1 denotes the root of the tree. You are given the parent nodes of 2 ~ N. Count for all v the number of ordered pairs such that their LCA is v.

Constraints:
1≤T≤100
2≤n≤100000
1≤pi

vvi G;
vl ans;

vi size;

void dfs( int u, int fa ){
  size[ u ] = 1;
  for( int v : G[ u ] ){
    if( v == fa ) continue;
    dfs( v, u );
    size[ u ] += size[ v ];
  }
}

void dfs2( int u, int fa ){
  --size[ u ];
  ans[ u ] = 1;
  for( int v : G[ u ] ){
    if( v == fa ) continue;
    ans[ u ] += 1LL * size[ v ] * ( size[ u ] - size[ v ] );
    ans[ u ] += size[ v ] * 2;
    dfs2( v, u );
  }
  ++size[ u ];
}

void solve(){
  int T; cin >> T;
  while( T-- ){
    int N; cin >> N;
    G = vvi( N );
    size = vi( N );
    ans = vl( N );
    for( int i = 1; i < N; ++i ){
      int p; cin >> p; --p;
      G[ p ].emplace_back( i );
    }
    dfs( 0, -1 );
    dfs2( 0, -1 );
    for( int i = 0; i < N; ++i ){
      cout << ans[ i ] << " \n"[ i + 1 == N ];
    }
  }
}