羅区P4768 / LOJ2718 / UOJ393 [NOI2018]リターンジャーニー

クラスカルは、最初の$ $再構築された木を知っている必要があります:クラスカル$ $実行している間に、明らかに、仮想点を構築するために選出され、2つのブロックのルートがユニコムを接続するエッジが、最終的なバイナリヒープを与えます。

最も遠いが、このサブツリー内に、$ d_u $の最小の値を高い実行倍増、このバイナリヒープで

書式#include <cstdioを> 
する#include <CStringの> 
の#include <アルゴリズム> 
書式#include <キュー>
 使用して 名前空間はstdを、
const  int型 N = 200050 ;
const  int型 M = 400050 ;
チャーはrB [ 1 << 21 ]、* S * T、WB [ 1 << 21 ]。
int型 WP = - 1 ; 
インラインチャー GC(){ 戻り S == T &&(T =(S = rBの)+関数fread(RB、11 << 21、STDIN)、S == T)EOF:* S ++  ;}
インラインボイドフラッシュ(){関数fwrite(WB、1、WP + 1、STDOUT); WP = - 1 ;} 
インラインボイド PC(チャー C){ 場合(WP + 1 ==(1 << 21))のフラッシュ(); WB [ ++ WP] = C;} 
インラインint型RD(){
     チャー C = GC()。
    一方、(C < 48 || C> 57)C = GC()。
    INT X = C&15 (;> = C、C = GC()48 && C <= 57、X =(X <<; C = GC())3)+(X << 1)+(C&15 )。
    リターンのx; 
} 
短い BUF [ 15 ]。
インラインボイド重量(INT X){
     短い L = - 1 一方、(X> 9 ){ 
        BUF [ ++ L] = X%10 
        X / = 10 
    } 
    PC(X | 48 )。
    一方、(L> = 0)PC(BUF [1 - ] | 48 )。
    PC(' \ nを' ); 
} 
int型G [N]に[M << 1 ]、[M << W 1 ]、NXT [M << 1 ]、SZ、D [N]、PA [N << 1 ]、LC [N << 1 ]、RC [N << 1 ]、V [N << 1 ]、F [ 18 ] [N << 1 ]、DEP [N << 1 ]、ミネソタ州[N << 1 ]、N。
構造体の縁{
     int型、U、V、P W。
} [M]。
構造体ノード{
     int型P、D。
    ノード(){} 
    ノード(INT P、INT D):P(P)、D(D){} 
    インラインブール 演算子 <(CONSTノード&{ 戻り D> BD;} 
}。
PRIORITY_QUEUE <ノード> Q; 
インラインブール CMP(辺A、辺B){ 戻り AP> BP;} 
インラインボイド(追加INT U、INT V、INT {C)
    [に対して SZを++] = V [SZ、W Cが=; NXT [SZ ] = G [U]、G [U] = SZ。 ++ SZ] = U; [SZ] = CをW; NXT [SZ] = G [V]、G [V] = SZ。
} 
INT GF(INT X){ 戻り PA [X] == X X:PA [X] = GF(PA [X]);}
 ボイド DFS(int型 Uを、INT  FA){
    DEP [U]= DEP [F [ 0 ] [U] = FA] + 1 ショート I = 1、(1 << I)<DEP [U]; ++ I)F [i]が[U] = F [I- 1 ] [F [I- 1 ] [U]。
    もし(U> N){ 
        DFS(LC [U]、u)は、DFS(RC [U]、U)。
        ミネソタ州[U] = 分(ミネソタ州[LC [U]、ミネソタ州[RC [U])。
    } ミネソタ州[U]は= ; D [U]を 
} 
インラインint型作業(INT U、INT P){
     ための短い I = 17 ; I> = 0 ; - I)もし(DEP [U] - (1 << I)> 0 && V [F [i]が[U]]> P)U = F [i]が[U]。
    返すミネソタ州を[U]; 
} 
int型のmain(){
     int型 T = RD()、M、Q、S、I、U、V、LANの、TOT、X、Y。
    ブールK; 
    ノードH。
    一方、(T-- ){ 
        TOT = N = RD(); M = RD()。
        memsetの(G、0はsizeof(G))のLAN = SZ = 0 (i = 1 ; I <= M ++ {I)
            [I] .U = RD(); [I] .V = RD(); [I] .W = RD()。 [I] .P = RD()。 
            ([I] .U、[I] .V、[I] .W)を加えます。
        }
        以下のための(I = 2 ; iは= N <; ++ I)D [i]は= 2000000001 
        Q.push(ノード(1、D [ 1 ] = 0 ))。
        一方、(!{Q.empty())
            H = Q.top(); Q.pop()。
            もし(HD> D [U = HP])続けます(; I I = NXT [I] I = G [U])であれば(D [U] W + [I] <D [v = [I]乃至])Q.push(ノード(V、D [ V] = D [U] + W [I]))。
        } 
        ため(i = 1 ; iが<(N << 1); ++ I)PA [I] = I。
        ソート(A + 1、+のM + 1 、CMP)。
        (i = 1 ; I <= M; ++ I)の場合(!(X = GF([I] .U))=(Y = GF([i]は.V))){ 
            PA [X ] = ++ TOT; PA [Y] = TOT。
            LC [TOT] = xと; RC [TOTは] = yと、
            V [TOTは] = [I] .Pと、
            もし(TOT ==(N << 1) - 1破ります
        } 
        DFS(TOT、0 ); 
        Q = RD(); K = RD(); S = RD()。
        一方、(q-- ){ 
            X=(RD()+ K * lans- 1)%N + 1、Y =(RD()+ K *のLAN)%(S + 1); 
            重量(のLAN = 仕事(X、Y))。
        } 
    } 
    フラッシュ()。
    リターン 0 ; 
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/sunshine-chen/p/11258903.html