$ソル$
最も暴力的なアプローチは、チェーンの最長辺を列挙することで、その後、一度$ ANS $更新されたすべての鎖長を、数えました。
ここでは半分の答えを考えるのは、容易な最大の最小値が必要です。$半ば$の半分の値については、すべてのチェーンをチェーンの長さは$半ば$に等しい未満であれば、そうでない場合、治療を必要としない合法である、すべてのチェーンをスイープ記録$ 1 + $介してエッジ数最後に、最も長い鎖を見て、0に、鎖の鎖長MID $ $最大側の数に等しいパスの数を見つけることは、より小さい又はMID $等しい。$このような場合側は、その後、$半ば$は、明らかに違法では小さすぎます。
ツリー差の側によるメンテナンス時間。
$コード$
#include <ビット/ STDC ++ H> に#define ILインライン の#define RiをINTレジスタ の#define(iは、、B)は(RI iは= ++ I;私は= Bを<)行く の#define iが、(はい、B)(RI iについては、=; I> = B; - I) の#define(RI I = bのE(I、U)[U]; I; I [i]が.nt)= 位定義 MEM(A、B)のmemsetを(A、B、はsizeof(A)) の#defineっ長い長 の#define DB二重 の#define INF 2147483647 使用 名前空間STDを、 ILのINTのリード() { Riをは、X = 0、Y = 1。チャー C = GETCHAR()。 しばらく(<C' 0 ' || C> ' 9 '){ もし、(C == ' - ')Y = - 1 ; C = GETCHAR();} 一方、(C> = ' 0 ' && C <= ' 9 '){X =(X << 1)+(X << 3)+ C- ' 0 ' ; C = GETCHAR();} 戻りのx *のY。 } のconst int型 N = 300010 。 INTの N、M、F [N]、CT、DEP [N]、[N] [B 19 ]、DIS [N]、T [N]、NUM、DD、BOOL FL; 構造体 ND { int型 V、NT、W;} [N * 2 ]。 構造体 ND1 { int型、U、V、L、LC;} C [N]。 IL ボイド追加(RI Uは、RのVロードアイランドW){[++ CT] =(ND){V、W [U]} B; B [U] = CT;} ILの空隙ビルド(RI U、 RI FA) { DEP [U] = DEP [FA] + 1 。 F [U] [ 0 ] = FA。 行く(I、1、18 F)[U] [I] = F [F [U] [I- 1 ]] [I- 1 ]。 E(I、U) { 場合([I] .V == FA)継続。 DIS [I] .V] = DIS [U] + [I] .W。 ([I] .V、U)を構築します。 } } のIL INTのLCA(RI UロードアイランドV) { 場合(DEP [U] < DEP [V])スワップ(U、V)。 はい(I、18、0)であれば(DEP [F [U] [I]]> DEP [V])U = [U] F [i]は、 もし(DEP [U] = DEP [V]!)U = F [U] [ 0 ]。 場合(Uは== v)を返すuと。 はい(I、18、0)であれば(F [U] [I] = F [v] [I]!)U = F [U] [i]は、V = F [v] [I]。 戻り F [U] [ 0 ]。 } ILBOOL CMP(ND1のX、ND1のY){ 戻り XL> イル;} ILは、INT DFS(RI U) { RiをのRET = 0 。 E(I、U) { 場合([I] .V == F [U] [ 0 ])続けます。 RI QVQ = DFS([I] .V); RET + = QVQ。 もし(QVQ == NUM)FL = 1、DD = MAX(DD、[I] .W)。 } RET + = T [U]。 リターンRET; } IL ブールCK(RI X) { もし、(C [ 1 ] .L <= X)リターン 1 ; MEM(T、0); NUM = 0 ; DD = 0、FL = 0 。 行く(I、1 、M) { もし、(C [i]が.L <= X)破ります。 RI U = C [i]は.U、V = Cを[I] .V、LC =のC [i]を得た。LC。 ++ T [U]; ++ T [V]、T [LC] - = 2 ; ++ NUM。 } DFS(1 )。 もし(!フロリダ州)の戻り 0 ; もし(C [ 1 ] .L-DD> x)をリターン 0 。 リターン 1 ; } int型)(主 { N =読み取る()、M = (読み取り) (I、行く1、N- 1){RI U =読み取る()、V =読み取る()= W )(読み取り;(U、V、W)を追加し、(W、UがV)を追加;} ビルド(1、0 ); 行く(I、1 、M) { RI U =(読み取り)、V =読み取る()、LC = LCA(U、V)。 C [I] =(ND1){U、V、DIS [U] + DIS [V] - 2つの * DIS [LC]、LC}。 } ソート(C + 1、C + N + 1 、CMP)。 RI L = 0、R = C [ 1 ] .L + 1 。 一方、(L <= r)と { RI半ば =(L + R)>> 1 。 もし(CK(MID))のような中間、R =半ば= 1 。 他リットル=ミッド+ 1 ; } のprintf(" %Dを\ n "、など)。 リターン 0 ; }