問題へ[NOIP2015]輸送計画ソリューション

トピックの背景

今年2044年、人類は宇宙の時代に入りました。

タイトル説明

L N所有惑星、n-1個の双方向チャネルであり、各チャネルは、そのN-1個の、2つの惑星間で確立されます

チャネル接続すべての惑星L国。

リトルPは、物流会社の担当で、同社は、フォームごとに、輸送計画を輸送計画の数を持っている:一つのことがあります

航空宇宙の惑星のUI数から最速の経路に沿って第VIに惑星に飛ぶ宇宙船の必要性をフロー。もちろん、コースを渡して宇宙船は、それは、チャネルjのためにそれがTJのにかかる時間のいずれかの船の通過を時間がかかり、任意の2つの宇宙船間の干渉を生成しません。

科学技術の革新を奨励するためには、ワームホールに小さなPチャネルの変換を可能にする水路の建設L状態に関与小さな国L Pの物流会社に同意した王は、ワームホール通過宇宙船は時間がかかるではありません。

小Pのワームホールの物流会社の構築が完了する前にM輸送計画によってワイヤード事前。ワームホールの建設が完了した後、m個の輸送計画は、すべての宇宙船から始まる、開始します。m個の輸送計画が完了したら、小さな物流会社Pステージ作業は完了です。

小さなPは、ワームホールに変換されるもちろんのかを選択し、小さなP物流会社がワークステージのために必要な最小時間はどのくらいですか?完成見つけようとして自由である場合

 

$ソリューション:$

実際には、非常にシンプルな......計り知れないほどのもので王国を守る......

質問の意味があなたにいくつかの木のパスを与えることです、彼らの最大の長さを最小限に抑え、右側を削除する可能性があります。「最大最小は」明らかに半分ああです。

私は右のポイントへの最長経路の長さの半分を持っている可能性があるため、それは、合法的な、しかし役に立たないかチェック、すべての最初の二つは$を離れた場合、ANS \ GE $最長パスの長さにする必要があります考えてみましょう。

私たちは、その後、次にする事は答え$ $で最長経路の長さを排除するために右側削除操作はそんなに(セットw)の長さを-ans使用することです$ \当量ANS $パスの長さを無視することができます。パスの残りの部分では、これらのパスの一般的な側面がある場合は、それが正当と判断することができます$、wは右側$ \ GEを満たしています。

ツリーの共通端側を求めるパスカバレッジ周波数差木板のために変換することができ、lca- = 2 ++ Y、離散境界X ++のために注目されます。

その後、直接LCAを解決することができるものの長いパス。

それは抗AKので間違いなく、威厳D2T3されているため。約半分の過去の境界でカード剛= =があります。

書式#include <cstdioを>
書式#include <iostreamの>
書式#include <CStringの>
#define PAペア<int型、int型>
レジスタリの#define
名前空間stdを使用。

const int型のL = 1 << 20 | 1。
チャーバッファー[L]、* S * T。
#define GETCHAR()((S == T &&(T =(S =緩衝液)+関数fread(1、L、標準入力バッファ)、S == T))EOF:* S ++)

インラインint型は、(読み)
{
    INT X = 0、F = 1; CHAR CH = GETCHAR()。
    一方、(isdigit(CH)!){IF(CH == ' - ')= -1 F; CH = GETCHAR();}
    一方、(isdigit(CH))X = X * 10 + CH-'0' 、CH = GETCHAR()。
    X F *を返します。
}
CONST INT N = 3E5 + 5。
INTにN、M、[N << 1]、頭部[N]、NXT [N << 1]、TOT、W [N << 1]。
INTサイズ[N]、息子[N]、トップ[N]、FA [N]、DEP [N]、DIS [N]。
PAのP [N]。
INT D [N]、_ LCA [N]、DIF [N]、maxw。
インラインボイド追加(int型のx、int型のy、int型Z)
{
    【++ TOT = Yであり;
    NXT [TOT =頭部[X]。
    ヘッド[X] = TOT。
    【TOT] W = Z。
}
無効DFS1(int型のx、int型のF)
{
    FA [X] = F; DEP [X] = DEP [F] +1;サイズ[X] = 1。
    以下のために(INT I [x]はヘッド=; I; I = NXT [i])と
    {
        INT Y [i]はに=。
        (Y == f)は続ける場合。
        DIS [Y] = DIS [X] + W [i]は、
        DFS1(Y、X)。
        サイズ[X] + =サイズ[Y]。
        IF(サイズ[Y]>サイズ[息子[X]])息子[X] = Y。
    }
}
無効DFS2(int型のx、int型トップ)
{
    トップ[X] =トップ。
    IF(息子[X])DFS2(息子[x]は、上)。
    以下のために(INT I [x]はヘッド=; I; I = NXT [i])と
    {
        INT Y [i]はに=。
        (TOP [Y])が継続する場合、
        DFS2(Y、Y)。
    }
}
インラインINT LCA(int型のx、int型のY)
{
    一方(上部[X]!= TOP [Y])
    {
        (DEP [TOP [X] <DEP [トップ[Y])スワップ(X、Y)であれば、
        X = FA [TOP [X]]。
    }
    IF(DEP [X]> DEP [Y])スワップ(X、Y)
    戻り値は、x;
}
無効DFS(int型x)は、
{
    以下のために(INT I [x]はヘッド=; I; I = NXT [i])と
    {
        INT Y [i]はに=。
        もし(Y == FA [X])続けます。
        DFS(Y)。
        DIF [X] + =差分〔と〕。
    }
}
ブール裁判官(int型のx、int型CNT、INT LEN)
{
    以下のために(INT I [x]はヘッド=; I; I = NXT [i])と
    {
        INT Y [i]はに=。
        もし(Y == FA [X])続けます。
        IF(DIF [Y] == CNT && W [i]は> = LEN)リターン1。
        IF(裁判官(Y、CNT、LEN))リターン1。
    }
    0を返します。
}

インラインブールチェック(int型のval)
{
    IF(maxw <= val)でリターン1。
    ため(再INT iは= 1; iが<= N; I ++)DIF [I] = 0;
    int型CNT = 0;
    ため(再INT I 1 =、iが<= M; I ++)
    {
        IF(D [i]が<= val)で続けます。
        CNT ++;
        DIF [P [i]が1次回] ++; DIF [P [i]は.second] ++;
        DIF [_lca [I]]  -  = 2。
    }
    DFS(1)。
    リターン裁判官(1、CNT、maxw-VAL);
}

メインint型()
{
    N =読み取る(); M =(読み取り)。
    最大のint = 0;
    (; iが<N;再INT iは1 = I ++)のために
    {
        INT X =読み取る()、Y =読み取り()、Z =読み取ります();
        (x、y、z)を追加し、(X、Y、Z)を加えます。
        マックス= MAX(最大値、Z)。
    }
    DFS1(1.0); DFS2(1,1)。

    ため(再INT I 1 =、iが<= M; I ++)
    {
        INT X =読み取る()、yはREAD()、LCA = LCA(x、y)を=。
        P [I] = make_pair(X、Y)
        D [I] = DIS [X] + DIS [Y] -2 * DIS [LCA]。
        maxw = MAX(maxw、D [I])。
        [I] = LCA _lca。
    }
    INT、L = maxw-MAXE、R = maxw、ANS = R。
    一方、(L <= r)と
    {
        INT半ば= L + R >> 1。
        IF(チェック(MID))ANS =中間、R =ミッド1。
        他リットル=ミッド+ 1;
    }
    printf( "%d個の\ n"、ANS)。
    0を返します。
}

 

おすすめ

転載: www.cnblogs.com/Rorschach-XR/p/11808751.html
おすすめ