流行制御

羅バレー

実際には、やがて私は、同じ一般的な理解を考えていました

しかし、あまりにもこんにゃくのために

達成することは困難

 

1月には、前にこの質問に対する私のブラシの木のDP、およびブラシについて

ああ、私はDPとの良好な結果を0ptsてもらいます

 

とにかく、私は今を理解します

<ビット/ STDC ++ Hは>の#include
 の#define再戻り
 の#defineっ長い長
 の#define - (I; I> = Rを、I = 1 int型レジスタ)12のための(I、L、R)
 の#define(I INCを、L、R)は、iがLに= INT(登録用; I <= R; ++ i)を 
 使用して 名前空間STDを、
テンプレート <型名T>インラインボイド RD(T&X)
{ 
    チャー C。BOOL F = 0 一方、((C = GETCHAR())< ' 0 ' || C> ' 9 'であれば(C == ' - ')、F = 1 
    バツ= C ^ 48 一方、((C = GETCHAR())> = ' 0 ' && C <= ' 9 ')、X = X * 10 +(C ^ 48 )。
    もし(F)X = - X。
} 

のconst  int型 MAXN = 300005 INT CNT、K、N、M、HD [MAXN]、FA [MAXN] [ 21 ]。
int型SIZE1、POS [MAXN]、VIS [MAXN]。

長い 長い DIS [MAXN] [ 21 ]。

構造体ノード{
     INT に、NT、ヴァル。
} E [MAXN << 1 ]。
インライン無効追加(int型のx、int型の Y、int型Z)
{ 
    E [ ++ K] .TO = Y; E [K] .nt = HD [X]; HD [X] = K; E [K] .val = Z ; 
    E [ = xの.TO ++ K]、E [k]は.nt = HD [Y]; HD [Y] = K; E [K] .val = Z。
} 


インラインボイド DFS(INT X)
{ 
    ためint型 iは= 0 ; FA [FA [X] [I] [I]; ++ I)
    { 
        FA [X] [I + 1 ] = FA [FA [X ] [I] [I]。
        DIS [X] [I + 1 ] = DIS [X] [I] + DIS [FA [X] [I] [I]。
    } 
    
    のためのINTI = HD [X]; I; I = E [I] .nt)
    { 
        int型、V = E [I] .TO。
        もし(V == FA [X] [ 0 ])続けます
        FA [V] [ 0 ] =のX。
        DIS [V] [ 0 ] = E [I] .val。
        DFS(V); 
    } 
} 

構造体LLL 
{ 
    int型のFR、left_dis、ID。
    ブール 演算子 <(LLL c)はCONST 
    { 
        再left_dis < c.left_dis。
    } 
} [MAXN]。

int型CNTA、CNTB、[MAXN]必要があります。
構造体LLI 
{
    int型のval、ID;
    ブール 演算子 <(LLI C)のconst 
    { 
        再ヴァル < c.val。
    } 
} [MAXN】b。

インラインBOOL DFS1(INT X)
{ 
    場合(VIS [X])に再1 int型 SIZ = 0 ;
    以下のためにint型 I = HD [X]を、I; I = E [I] .nt)
    { 
        int型、V = E [I] .TO。
        もし(V == FA [X] [ 0 ])続けます
        SIZ | = 1 ;
        もし(DFS1(V)== 0 
        {VIS [X] = 0 ;再0 ;} 
    } 
    もし(!SIZ)
        {VIS [X] = 0 ;再0 ;} 
    VIS [X] = 1 1 ; 
} 

インラインブールチェック(LLのX)
{ 
    CNTB = CNTA = 0 
    INC(I、0、N)VIS [I] = 0 ; 
    
    INC(I、1 、M)
    { 
        int型 V = POS [i]は、今= 0 
        12月(I、 20であり0IF(FA [V] [I]> 1。 && DIS [V]今<= X [I] +){今+ = DIS [V] [I]; V = FA [V] [私は];} 
        
        int型今-DIS-X =左の[V] [ 0 ]; 
        
        IFは(FA [V] [ 0 ] == 1左&&> = 0 // 境界点で、//は、返すことができる点は、注射またはされていタイ 
         // 左最大走行可能距離からの逸脱である 
            [++ CNTAを] = (LLL){V、左、CNTA} 
        
        そう VIS [V] = 1 ; 
    } 
    
    // ブロックされませんドットマーク
    以下のためにint型 I = HDの[を1 ]; Iは、I = E [I] .nt)
    {
         INT= V E [I] .TO; 
        DFS1(V); 
    } 
    
    ソート(A + 1、A + + CNTA 1。);
     int型ノワ= 0 ; 
    
    
    // 最小開始ノードに戻ることができない(ブロックされていない)値を見つける 
    INCを(I 、1 、CNTA)
    { 
        IF(VIS [A [I] .fr] && A [I] .left_dis <DIS [A [I] .fr] [!0 ])
        { 
            [I]は.left_dis = - 1。; 
            VIS [I] .fr] = 1 ;
             - ノワ; 
        } 
    } 
    
    ソート(A + 1、A + + CNTA 1。);
    以下のためにint型 I = HD [ 1 ; I = I] 、E [I] .nt)
    { 
        int型、V = E [I] .TO。
        もし(VIS [V]!)++ CNTB] = B (LLI){E [I] .val、V}。
    } 
    ソート(B + 1、B + CNTB + 1 )。
    
    int型 nowb = 1 ; 
    INC(I、ノワ + 1 、CNTA)
    { 
        もし ++([nowb] .val <= [I] .left_dis B)nowb。
        もし(nowb == CNTB + 1 RE)1 
    } 
    0 
} 
int型メイン()
{ 
freopenは(" in.txt "" R " 、STDIN)。
//     freopenは( "testdata.in"、 "R"、STDIN)。
    INT X、Y、Z。    
    LLのL = 0、R = 0 
    RD(n)は、
    INC(I、2 、n)の
    { 
        RD(x)は、RD(Y)、RD(Z)。
        (x、y、z)を加えます。
        R + = Z。
    } 
    
    // DFS得到倍增数组
    ためINT I = HD [ 1 ]; I; I = E [I] .nt)
    {
         ++ SIZE1。
        int型V = E [I] .TO。
        FA [V] [ 0 ] = 1 ; DIS [V] [ 0 ] = E [I] .val。
        DFS(V); 
    }     
    
    RD(M)。
    もし(M <SIZE1){のprintf(" -1 ");再0 ;} 
    
    INC(I、1 、m)のRD(POS [I])。

    一方、(L <= R)
    { 
        int型ミッド=(L + R)>> 1 もし R =ミッド((MID)をチェックしてください)1 リットル=ミッド+ 1 ; 
    } 
    
    のprintf(" %のLLD "、L)。0 ; 
}

 

おすすめ

転載: www.cnblogs.com/lsyyy/p/11529933.html