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 。1、0 ); 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 * /