1 条题解
-
0
#include <bits/stdc++.h> using namespace std; const int N = 500005 , LG = 20; struct node { int to , val , nxt; } e[ N << 1 ]; int head[ N ] , tot = 0; int d[ N ]; int f[ N ][ LG ]; int n; void add_edge( int from , int to ) { e[ ++ tot ] = node{ to , head[ from ] }; head[ from ] = tot; } void add_fa( int u , int fa ) { d[ u ] = d[ fa ] + 1; f[ u ][ 0 ] = fa; for( int i = 1 ; i <= 19 ; i ++ ) f[ u ][ i ] = f[ f[ u ][ i - 1 ] ][ i - 1 ]; } int lca( int x , int y ) { if( d[ x ] < d[ y ] ) // 确保dx>=dy x ^= y ^= x ^= y; for( int i = 19 ; i >= 0 ; i -- ) if( d[ f[ x ][ i ] ] >= d[ y ] ) x = f[ x ][ i ]; if( x == y ) return x; for( int i = 19 ; i >= 0 ; i -- ) if( f[ x ][ i ] != f[ y ][ i ] ) x = f[ x ][ i ] , y = f[ y ][ i ]; return f[ x ][ 0 ]; } int len( int x , int y ) { int l = lca( x , y ); return d[ x ] + d[ y ] - 2 * d[ l ]; } int main() { cin >> n; int st = 1 , ed = 1; for( int i = 2 , p ; i <= n ; i ++ ) { cin >> p; add_edge( p , i ); add_fa( i , p ); if( len( st , ed ) < len( st , i ) || len( st , ed ) < len( i , ed ) ) { if( len( st , i ) < len( i , ed ) ) st = i; else ed = i; } cout << len( st , ed ) << " "; } return 0; }
- 1
信息
- ID
- 19
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 5
- 已通过
- 3
- 上传者