题解------- CF1304E 1木とクエリ

ポータル

効果の対象に

Q時間とポイント$ X $ $ Y $の接続ポイントを尋ね、その後、あなたの無根樹を与える、あなたは、パスの長さは、単純に$ K $が存在するかどうかを$ B $ A $ $を指すようにポイントから頼みます、それぞれの側の後に尋ねると、新しく追加されたが削除されます。

アイデア:木のLCA

我々は、これはその質問の木のバージョンであると言うことができ、同様に2019pjt4とのタイトル。

私達はちょうどエッジを追加すると$簡単なパスB $に$を$の後に何をすべきかを終了したかったので、それぞれの完成質問は、削除するための新しいエッジを追加配置しますので。

我々は2例を議論することができるように:

    1. 1.左$ \(X、Y \右)$ $カウント\パスは(B \右)左 $ 。
    2. 2.のみ$パスの左$ \(、B \右)を数えます。

単にA-> X-> Y-> BまたはA-> Y-> X-> Bまたは経路のA-> Bを求めている、 既知の 2つのツリーの間の経路長は、LCAを求めるために使用することができる となくなって。

しかし、コースの長さの$ K $が存在するかどうかを決定するためにどのように?まず第一に、私たちは知っておく必要があります。

私たちは、親ノードに行けば、それは2つのエッジを追加します。

私はあなたがあなた自身のマップを描くことができるかを理解していません。

その後、我々は大のパスの長さよりも$ K $は、私たちが行くことを父ノードに出て行けば、それについて考え、そして誰の長さ$ kは$パスは2の倍数の余分な部分があるんではない場合ならば、見つけることは容易です。

コード

#include <ビット/ STDC ++ H> の#define RI INTレジスタ使用名前空間



 STDを、

テンプレート < クラス T> インラインボイドリード(T&X){ 
    TはF = 1X = 0チャー C = GETCHAR()。
    一方、(C> ' 9 ' || C < ' 0 ' ){
         もし、(C == ' - ' 
            、F = - F。
        C = GETCHAR()。
    }

    一方、(C> = ' 0 ' && C <= ' 9 ' ){ 
        X = X * 10 + C - ' 0 ' 
        C = GETCHAR()。
    } 
    、X * = F。
} 

CONST  INT = 1E5 + N 7 int型のn;
構造体のエッジ{
     int型NXT、であり; 
}エッジ[N << 1 ]。
INT ヘッド[N]、TOT。
INT DEP [N]、ST [N] [ 21 ]。

列をなしてボイド追加(int型のx、int型のY){ 
    エッジ[ ++ TOT] .nxt = 頭部[X]。
    エッジ【TOT] .TO = Y。
    ヘッド[X] = TOT。
} 

インラインボイドを読む(){ 
    読み取り(N)
    以下のために(RI iが= 1 ; I <N; I ++ ){
         int型のX、Y。
        (X)を読み取り、(y)を読み出します。
        (x、y)を加えます。
        (Y、X)を追加します。
    } 
} 

インラインボイド DFS(int型のx、int型FA){ 
    DEP [X] = DEP [FA] + 1; 
    ST [X] [ 0 ] = FA。
    以下のために(RI iが= 1 ; I <= 20 ; I ++ 
        ST [X] [I] = ST [ST [X] [I - 1 ] [I - 1 ]。
    以下のために(RI I [x]はヘッド=; I;私は= エッジ[I] .nxt){
         int型、Y = エッジ[I] .TOと、
        もし(Y == FA)を
             続けます
        DFS(Y、X)。
    } 
} 

インラインINT Lcaを(int型のx、int型のY){
     場合(DEP [Y]> DEP [X])
        スワップ(X、Y)
    以下のために(RI iが= 20、I> = 0 ; i-- 場合(DEP [ST [X] [I]]> = DEP [Y])
            X = ST [X] [I];
    もし(x == y)は
         リターンX。
    以下のために(RI iは= 20、I> = 0 ; i-- であれば(!ST [X] [I] = ST [Y] [i])と
            、X = ST [X] [i]は、Yは、= ST [Yを][私];
    リターン ST [X] [ 0 ]。
} 

int型のmain(){ 
    読み取り()。
    DFS(10 );
    int型T; 
    (T)を読み出します。
    一方、(T-- ){
         int型のX、Y、A、B、K。
        int型RES1、RES2、RES3。
        ()、(K)、(b)の読み取り読み取り、(X)を読み出し(y)が読み出され、読み出さ。
        INT Lca1 = Lcaを(a、b)は、Lca2_1 = Lcaを(X)、Lca2_2 = Lcaを(Y、B)、Lca3_1 = Lcaを(Y)、Lca3_2 = Lcaを(X、B)。
        
        RES1 = DEP [A] + DEP [B] - 2 * DEP [Lca1]。
        RES2 = DEP [A] + DEP [X] + DEP [Y] + DEP [B] - 2 * DEP [Lca2_1] - 2 * DEP [Lca2_2] + 1 
        RES3 = DEP [A] + DEP [X] + DEP [Y] + DEP [B] -2* DEP [Lca3_1] - 2 * DEP [Lca3_2] + 1 

        もし(RES1 <= K &&(K - RES1)%2 == 0 ){ 
            プット(" YES " );
            続け; 
        } 
        であれば(RES2 <= K &&(K - RES2)%2 == 0 ){ 
            プット(" YES " );
            続け; 
        } 
        であれば(RES3 <= K &&(K - RES3)%2 == 0 ){ 
            プット(" YES ");
            続け; 
        } 
        プット(" NO " )。
    } 
    戻り 0 
}

おすすめ

転載: www.cnblogs.com/ASTiKi/p/12315573.html