RMQ求lca

Xie2Yue發表於2024-07-15

把樹展開成鏈
然後ST表

void dfs( int u , int ft ){
	dep[ u ] = dep[ ft ] + 1 ;
    a[ fir[ u ] = ++m ] = u ;//fir[i]->i號點在鏈上第一個位置
	for( int i = f[ u ] ; i ; i = nxt[ i ] ){
		int v = to[ i ] ;
		if( v == ft )continue;
		dfs( v , u ) ;
		a[ ++m ] = u ;//a[]儲存鏈
	}
}
void initRMQ(){
	for(int i = 1 ; i <= m ; i++ ) RMQ[ i ][ 0 ] = a[ i ] ;
	for(int j = 1 ; j <= 18 ; j++ ) for(int i = 1 ; i <= m - ( 1 << j ) + 1 ; i++ ){
		int x = RMQ[ i ][ j - 1 ] , y = RMQ[ i + ( 1 << ( j - 1 ) ) ][ j - 1 ] ;
		RMQ[ i ][ j ] = dep[ x ] < dep[ y ] ? x : y ;
	}
}