クラスカルは、最初の$ $再構築された木を知っている必要があります:クラスカル$ $実行している間に、明らかに、仮想点を構築するために選出され、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、1、1 << 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 ; }