トピックその一部を使用するための特別な条件に注意してください。
効果の対象に
N- $ $ $ a_iをツリー$の少し右を指しており、$ qを$時間ツリーは、長さL $の$パスがあるかどうかを尋ねます。
$ N、qは、$ 2 \ a_iを\ \ ^ 5,0 10秒
トピック分析
それは道路に点在形而上学で、2つの$条件$ a_iを\ルうまく利用して時間がありません。
パリティによる重量の分類、それぞれのポイントは、$ 1 $各点を追加し、パスは彼の息子のパスで表すことができる$ 0,1,2 $、木のように各パス、できるため+1 、パリティを変更は、$ 2 $各点を加え、サブパスによって表すことができる経路はパリティ保存、+2です。
だから、2つの経路にパリティに応じて、それぞれ連続しています。
そして、子どもが問題になる:ツリー最長パスを見つけます。$ F_ {I、0/1} $ I $ $自体が備えるチェーンダウンポイントを表し、パリティは最長鎖長、容易DPによって解決この問題$ 0 / $ 1であり。
1つの#include <ビット/ STDC ++ H> 2 のconst int型 MAXN = 100035 。 3 のconst int型 MAXM = 200035 。 4 5 int型 N、M、W [MAXN]、F [MAXN] [ 2 ]、ANS [ 2 ]。 6 INTのedgeTot、ヘッド[MAXN]、NXT [MAXM]は、[MAXM]エッジ; 7 8 int型リード() 9 { 10 CHAR CH = GETCHAR()。 11 INT NUM = 0、FL = 1 。 12 のための!isdigit(CH);(CH =GETCHAR()) 13 であれば(CH == ' - ')FL = - 1 。 14 のために(; isdigit(CH)、CH = GETCHAR()) 15 NUM =(NUM << 1)+(NUM << 3)+ CH- 48 。 16 リターン num個の*のFL。 17 } 18 空隙 addedge(INT U、INT V) 19 { 20 のエッジ[++ edgeTot] = V、NXT [edgeTot] =頭部[U]、ヘッド[U] = edgeTot。 21の エッジ【++ edgeTot] = U、NXT [edgeTot] =頭部[V]、ヘッド[V] =edgeTot; 22 } 23 空隙 MAX(INT&X、int型の Y){X = X> Y?X:Y;} 24の 空隙 DFS(int型のx、int型FA) 25 { 26 Fは、[X] [X]&W 1 ] = [X、W。 27 のために(int型 I =ヘッド[X];!I = - 1 ; I = NXT [I]) 28 { 29 のint V = 縁〔I〕。 30 であれば(== FA V)続けます。 31の DFS(V、X) 32 MAX(ANS [ 0 ]、F [x]は[ 0 ] + F [v] [ 0 ])。 33 マックス(ANS [ 0 ]、F [X] [ 1 ] + F [v] [ 1 ])。 34 マックス(ANS [ 1 ]、F [X] [ 1 ] + F [v] [ 0 ])。 35 マックス(ANS [ 1 ]、F [x]は[ 0 ] + F [v] [ 1 ])。 36 MAX(F [X] [W [X]&1 ]、[V] [F 0 ] + W [X])。 37 MAX(F [x]は[ 1 - (W [X]&1)]、F [v] [ 1 ] +W [X])。 38 } 39 マックス(ANS [ 0 ]、F [x]は[ 0 ])、MAX(ANS [ 1 ]、F [X] [ 1 ])。 40 } 41 のint main()の 42 { 43 のmemset(ヘッド、 - 1、はsizeof ヘッド) 44 N =)(読み取り、M = 読み取ります(); 45 のためには、(int型 i = 1 ; iが<= N; iが++)W [I] = (読み取り) 46 のために(int型 i = 1 ; iがN <I ++はaddedge(READ()、(読み取り)))。 47 DFS(1、0 ); 48 のために(INT X; M; - M) 49 { 50 、X = リード()。 51の プット(ANS [X - 1 ]> = X?" YES ":" NO " )。 52 } 53 リターン 0 。 54 }
終わり