[タイトル]思考ツリーDP HHHOJの#483 NOIP司馬懿

トピックその一部を使用するための特別な条件に注意してください。

効果の対象に

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(10 );
48      のためにINT X; M; - M)
 49      {
 50          、X = リード()。
51の          プット(ANS [X - 1 ]> = X?" YES "" NO " )。
52      }
 53      リターン 0 54 }

 

 

 

終わり

おすすめ

転載: www.cnblogs.com/antiquality/p/11183887.html