LCAテンプレートツリーセクションシーク

  •  O(LOGN)(N <= 10 ^ 6)
  • https://www.cnblogs.com/cangT-Tlan/p/8846408.html
  • ツリーは、各チェーンのデータ構造を維持するために、いくつかのチェーンに分割されています
  • 1の#include <ビット/ STDC ++ H>
     2  の#defineが長い長いっ
     3  の#define RLLレジスタLL
     4  の#define M 0x3f3f3f
     5  の#define(iはLを= int型のための(I、L、R)の場合、I <= R。私は)++
     6を 使用して 名前空間はstdを、 
    7  N、M、S、ヘッド[M]、[M]、X、Y、Z、TOT、K、Tっ。
    8  LL FA [M]、D [M]、トップ[M]、サイズ[M]、ID [M]、RIL [M]。
    9  構造体ノード1 {
     10      LLに、NXT。
    11 }、E [M << 1 ]。
    12  構造体NODE2 {
     13      のLL L、R、和、フラグ;
    14 }ツリー[M << 1];
    15  
    16  インラインLLリード(){
     17      のLL F = 1、和= 0 18      CHAR CH = GETCHAR()。
    19      ながら(!isdigit(CH)){ 場合(CH == ' - ')、F = - 1 ; CH = GETCHAR();}
     20      ながら(isdigit(CH)){合計=(合計<< 1)+(和<< 3)+(CH ^ 48)、CH = GETCHAR();}
     21      リターンのF *の和。
    22  }
     23  
    24インラインボイド追加(LLのX、LLのY){
    25      E [++ TOT] .TO = Y;
     26である      E [TOT]は.nxt = ;頭部[X]
     27      頭[X] = TOT;
     28  }
     29  
    30は、インラインボイド DFS1(U LL){ // 最初のパスをDFSツリートラバーサル、深さdの前処理、サイズこの点ノード数は、FA親ノード
    31である      D [U]は、D [FA [U] + = 1 ;
     32      サイズ[U] = 1 ;
     33である     ため(RLL = Iヘッド[U]; I; I = E [I]が.nxt){
     34が         IF(E [I] .TO =!FA [U]){
     35              FA [E [I] .TO] = U;
     36              DFS1( E [I] .TO);
     37              サイズ[U] + =サイズ[E [I]が.TO];
     38である         }
     39      }
     40  }
     41である 
    42はれるインラインボイド DFS2(U LL){ //は、子の数の重症度に応じてチェーン内のその点のみを確実に、エッジ分割数をノード。通常は重い側とライト側よりも少ないです。
    43は、      LL T = 0 ; // トップ即ち点、この頂点の重い縁
    44は     IF TOP [U]は=(TOP [U]!)U;
     45      (RLLヘッドI = [U]; I; I = E [I]は.nxt){
     46は、         IF FA = [U] .TO(E [I] &&サイズ[E [I]は.TO]> T)T =!E [I] .TO;
     47      }
     48      IF (T) {
     49          TOP [T]が= TOP [U];
     50          DFS2(T)。
    51である     }
     52である     ため(; I; RLLヘッドI = [U] I = E [I]が.nxt){
     53が         IF(E [I] .TO FA = [U] && E [I] .TO =!T) DFS2(E [I] .TO); 
     54である     }
     55  }
     56は、 
    57であるインラインLCA LL(LL X、Y LL){ // 2点が同一の操作が終了され、重鎖上に位置しています。そうでない場合、ポイントの重鎖の点の深さは、操作の終了時に浅い深さの点の位置もLCA望まれる深さまでスキップ
    58      ながら(TOP [X]!= TOP [Y]){
     59          IF(D [トップ[X] < D [TOP [Y])スワップ(X、Y);
     60          X = FA [TOP [X]];
     61である     }
     62が     IF(D [X]> D [Y])スワップ(X、 Y)
     63が     リターンX;
     64 }
     65  
    66  INT メイン(){
     67      N =(読み取り)、M =(読み取り)、Sは= )(読み取ります。
    68      (Iについて1、N- 1){X =読み取る()、Yは= (Y、X)を追加し、(x、y)を追加し、read()は}
     69      DFS2(S)、DFS1(単数または複数);
    70      (Iについて1、M){、y)は(読み取り= X =リード()のprintf(" %LLDする\ n " ;、LCA(X、Y))}
     71      リターン 0 72 }

     

おすすめ

転載: www.cnblogs.com/wi1d3on/p/11330922.html