$ Luogu2680 / NOIp2015 $交通計画

ポータル

$ソル$

最も暴力的なアプローチは、チェーンの最長辺を列挙することで、その後、一度$ 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、118 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、180であれば(DEP [F [U] [I]]> DEP [V])U = [U] F [i]は、
    もし(DEP [U] = DEP [V]!)U = F [U] [ 0 ]。
    場合(Uは== v)を返すuと。
    はい(I、180であれば(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)を追加;} 
    ビルド(10 ); 
    行く(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 ; 
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/forward777/p/11560098.html