1 条题解

  • 0
    @ 2023-11-1 20:26:27
    #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
    上传者