10.8あなた子宮内膜学校の人種

T1http://ezoj.org.cn/problem/382

一見シングルソース最短であるが、直接構築図の複雑さの要件を満たしていない明らかに、M ^ 2です。

スコア100が望ましい、双方向エッジ(右だけ一つの値)に接続されたすべてのポイントのセット内の各仮想点のための新しいセットを考慮し、複雑性O(nlgm)。

// 两岸 
する#include <cstdioを> 
する#include <アルゴリズム> 
書式#include <キュー> 
の#include <CStringの> 
 に#define LL長い長い
 の#define FN "道"
 の#define INF 824602269000
 使って 名前空間はstd; 
インラインボイドオープン()
{ 
    freopenは(FN " .IN "" R " 、STDIN)。
    freopenは(FN " の.out "" W " 、STDOUT)。
    1 ; LL S = 0チャー CH = GETCHAR()。
    一方、(CH < ' 0 ' || CH> ' 9 '){ 場合(CH == ' - ')、F = 0 ; CH = GETCHAR();}
     一方(CH> = ' 0 ' && CH <= ' 9 ')S =(S << 3)+(S << 1)+ CH- ' 0 '、CH = GETCHAR()。
    リターン F S: - ?sの。
} 
PRIORITY_QUEUE<ペア<-1,11,11->> Q。
LLのB [ 100010 ]、N、M、T、S、CNT、CT、頭部[ 100010 ]、DIS [ 100010 ]。
BOOL VIS [ 100010 ]。 
構造体ノード
{ 
    、NXT、ヴァルにLL。
} [ 200010 ]。
インラインボイド追加(LL から、へ-1,11,11-のヴァル)
{ 
    [ ++ CNT] .TO = であり; 
    [CNT] .val = ヴァル。
    [CNT] .nxt [=先頭から]。
    【ヘッドから =] CNT。
} 
int型)(主
{
    // オープン(); 
    N = read()は、M =()を読み出す; CT = N。
    int型 I = 1 ; I <= M Iは++ 
    { 
        int型 ++ CT; T =読み取ります() INT J = 1 ; J <= T; J ++)B [J] = 読み取ります(); 
        LL X = リード()。
        INT J = 1(B [j]は、CT、追加J ++; J <= T)0 )、追加(CT、B [j]を、X)。
    } 
    、S =読み取り()、Tは= )(読み取ります。
    以下のためにint型 I = 1 VIS [I] = {DIS [I] = INF; I <= CT iは++)0;} 
    q.push(make_pair(0、S)); DIS [S] = 0 ;
    一方、(!q.empty())
    { 
        LL X = q.top()は、第2。
        q.pop(); 
        もし(VIS [X])続ける ; VIS [X] ++ ;
        以下のためにint型 ; I iは=私は=ヘッドが[X] [I] .nxt)
        { 
            LLのY = [I] .TOと、
            もし(DIS [Y]> DIS [X] + [I] .val)DIS [Y] = DIS [X] + [I] .val、q.push(make_pair( - DIS [Y]、Y) ); 
        } 
    } 
    もし(DIS [T] == INF)DIS [T] = - 1 
    printf(" %のLLD " 、DIS [T])。
    リターン 0 ; 
}
T1

ZYBは、建設図面nlgq + Mが、これを行うことができ、我々はそれをしなければならない?最適化を教えて

T2。http://ezoj.org.cn/problem/383

すべてのポイントは、直径を構成することができるため(実際には非常に難しい)を見つけることは困難ではない2点間のパスの直径を服用すると、各セット、私たちはこのことを維持するので、毎回のいずれかから木で、2つのセットに分割することができます二組は、時間制限の保守作業中に完了することができます。

// 两岸 
する#include <cstdioを> 
する#include <アルゴリズム> 
書式#include <CStringの> 
の#include <ベクトル> 
 の#define LL長い長い
 の#define FN "LCT"
 使って 名前空間はstdを、
インラインボイドオープン()
{ 
    freopenは(FN " .IN "" R " 、STDIN)。
    freopenは(FN " の.out "" W " 、STDOUT)。
} 
LL LG [ 500010 ]、N、CNT = 0 <LL> S1、S2;
構造体ポイ
{ 
    LLのDEP、FA [ 100 ]。
} D [ 500010 ]。
インライン読み取り11()
{ 
    BOOLの F = 1 ; LL S = 0チャー CH = GETCHAR()。
    一方、(CH < ' 0 ' || CH> ' 9 '){ 場合(CH == ' - ')、F = 0 ; CH = GETCHAR();}
     一方(CH> = ' 0 ' && CH <= ' 9 ')S =(S << 3)+(S << 1)+ CH- ' 0 '、CH = GETCHAR()。
    リターン F S: - ?sの。    
} 
ボイドビルド(LLのX、LL FA)
{ 
    D [X]の.Fa [ 0 ] = FA、D [X] .DEP = D [FA] .DEP + 1 (LL I = 1、(1 Dが[X]の.Fa [i]は= D [D [X]の.Fa [1-; << I)<= D [X] .DEP iは++)1。] FA [I- 1 ]。
} 
インラインLLのLCA(LLのX、LLのY)
{ 
    LL ANS = 0 もし(D [X] .DEP < D [Y] .DEP)スワップ(X、Y)
    同時に(D [X] .DEP> D [Y] .DEP)ANS + = 1 <<(LG [D [x]の.DEP-D [Y] .DEP] - 1)、X = D [X]の.Fa [ LG [D [x]の.DEP-D [Y] .DEP] - 1 ]。
    もし(x == y)は戻りANS。
    (LL I = LG [D [X] .DEP] - 1 ; I> = 0 ; i-- であれば(!D [X]の.Fa [I] = D [Y]の.Fa [i])とANS + = 1 <<(I + 1)、X = D [X]の.Fa [i]は、Yは= D [Y]の.Fa [I]を、
    戻る ANS + 2を
} 
int型のmain()
{ 
    // オープン()。
    N =読み取る()+ 1 ; LG 1 ] = 1 
    s1.push_back(1); D [ 1 ]の.Fa [ 0 ] = 0 ; D [ 1 ] .DEP = 1 (LL I = 2 ; iが<= N; iが++ 
    { 
        LG [I] = LG [I- 1 ] +(1つの << LG [I- 1 ] == I)。
        LLのx = read()は、(X、i)を構築します。
        LL LC1 = s1.empty()?0:LCA(S1 [ 0 ]、I)、LC2 = s2.empty()?0:LCA(S2 [ 0 ]、I)。
        もし(MAX(LC1、LC2)> MX) 
        {
            MX =MAX(LC1、LC2)。
            もし(LC1 == MX){ (LL jを= 0 ; J <s2.size(); J ++)場合(LCA(S2 [j]は、I)== MX)s1.push_back(S2 [J])。 s2.clear();}
                     { (LL jを= 0 ; J <s1.size(); J ++)場合(LCA(S1 [j]は、I)== MX)s2.push_back(S1 [J]) ; s1.clear();} 
        } 
        もし(MAX(LC1、LC2)== MX)(LC1 == MX?S2:S1).push_back(I)。
        printf(" %d個の\ n "、s1.size()+ s2.size())。
    } 
    戻り 0 
}
T2

ZYBはマングのLCTはこの質問に住むことができる私たちに教えて、私たちはそれを持って、それは何を問題ではありませんか?

T3。http://ezoj.org.cn/problem/384

クークーないメイク...... ......

おすすめ

転載: www.cnblogs.com/ynyxy/p/11647604.html
おすすめ