Codeforcesラウンド#629(DIV。3)E.ツリークエリ(LCA)

https://codeforces.com/contest/1328/problem/E

説明対象が木である、問題は、ルートノードとして表現されています。

がk個の点の集合からパス未満存在またはパス満たす1に等しい場合の質問は、変換することができますか?

アイデア:

1.まず、事前乗算接合深さをオフライン、オンライン、その後の尋問LCAを容易にするために、

各問い合わせについて2.順次k個の点をスキャンしました。同時uおよびvまでの距離は、パスがそうすることを、見つけることができないこと、次いで、1より大きい場合、我々はuとLCAのVを得る点の集合UとV毎時間、uおよびvは、LCAにLCAの距離を算出しますuおよびvは、チェーンパス1以下までの距離です。

3.どのようにk個のポイントをチェックするには?UおよびLCAからの距離と点v、次のノードおよび分岐として比較するクエリに最も遠い点までLCA各チェックポイント以下、そのような貪欲ダウンが最適でなければなりません。

1の#include <ビット/ STDC ++ H>
 2  使用して 名前空間STDを、
3  CONST  INT MAXN = 2E5 + 500 4  CONST  INT maxbit = 18 5ベクター< INT > G [MAXN]。
6  INT DEP [MAXN]。
7  INT FA [MAXN] [maxbit]。
8  INT ログ[MAXN]。
9  INT N。
10 typedefの長い 長いLL。
11  ボイド追加(INT U、int型V){
12      G [U] .push_back(V)、G [V] .push_back(U)。
13  }
 14  空隙プレ(){
 15      ログ[ 0 ] = - 1 16      ログ[ 1 ] = 0、ログ[ 2 ] = 1 ;
17      のためにINT iは= 3ログ[I] =ログイン[I /; I <MAXN I ++)2 ] + 1 18  }
 19  空隙 DFS(int型 CUR、INT 父){
 20      DEP [CUR] = DEP [父] + 1 21     FA [CUR] [ 0 ] = 父。
22      のためにINT J = 1 ;(1 << J)<= nであり、j ++ ){
 23          、FA [CUR] [J] = FA [FA [CUR] [J- 1 ]] [J- 1 ]。
24      }
 25      ためINT iは= 0 ; iは<G [CUR] .size(); I ++ ){
 26          であれば(!G [CUR]、[I] = 父){
 27の             DFS(G [CUR]、[I] CUR);
28          }
 29      }
 30  }
 31  int型 LCA(INTU、INT V){
 32      であれば(DEP [U] < DEP [V])スワップ(U、V)。
33      INT DIST = DEP [U] - DEP [V]。
34      一方(DEP [U] =!DEP [V]){
 35          、U = FA [U] [ログイン[DEP [U] - DEP [V]]]。
36      }
 37      であれば(U == v)の戻りUと、
38      のためには、INTは、I> = iがログ[DEPを[U]] = 0 ; i-- ){
 39          であれば(!FA [U] [I] = FA [V] [I]){
 40              、U = FA [ U] [i]は、
41              V = FA [V] [I]。
42          }
 43      }
 44      リターン FA [U] [ 0 ]。
45  }
 46  int型のmain(){
 47      のint Q。
48      のscanf(" %D%D "、&​​N、&Q)。
49      のためにINT iは= 1 ; I <N I ++ ){
 50          INT U、V。
51          のscanf(" %D%D "、&​​U、およびV)。
52          追加(U、V)。
53      }
 54      プレ()。
55     (DFS 。10 );
 56である     一方、(Q - ){
 57が         INT K; scanfの(" %のD "、&K);
 58          BOOL F = 0 ;
 59          INT T [K + 1 ];
 60          INT I = 。1 ; I <= K; I ++)scanfの(" %のD "、およびT [I]);
 61である         INT [V = T 1 ]; // 現在のコントラスト点がVに設定されている
62である         ためINT I = 2; I <= K; I ++ ){
 63は、             INT LCA = LCA(V、T [I]);
 64              IF(ABS(DEP [T [I] - DEP [LCA])> 1つの && ABS(DEP [V] -dep [LCA])> 1 ){
 65                  F = 1 ; // LCA距離が同時に1よりも大きくなるように表示された場合、問題ツリー鎖の意味を満たすことが見出されてはならない
66                  ブレーク;
 67              }
 68              ABS(DEP [T [I] -dep [LCA])> ABS(DEP [V] -dep [LCA])ν= T [i]を:? V =、V;         // もしT [i]には、LCAより長い距離に、Vを置くように更新されますT [i]は、次の点との貪欲比較。    
69          }
 70          IF COUT <<(F!)" YES " << ENDL;
 71のIS         他の裁判所未満<< " NO " << てendl;
72      }
 73      リターン 0 74  }
 75  / * 
76  8
 77  13 13 9 12 13 1 13 1
 78  * /

 

おすすめ

転載: www.cnblogs.com/AaronChang/p/12590348.html