実際には、やがて私は、同じ一般的な理解を考えていました
しかし、あまりにもこんにゃくのために
達成することは困難
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であり、0)IF(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 ; }