[bzoj3531]旅行

その木部、および宗教点レンジセグメントツリーメンテナンス間隔でダイナミックオープンを開くために、最大SUM 正規ツリーが同じ部分を処理することができるように、。

1つの#include <ビット/ STDC ++ H>
 2  使用して 名前空間STDを、
3  の#define N 100005
 4  の#define半ば(L + R >> 1)
 5  構造体JI {
 6      int型NEX、であり;
7 }エッジ[N << 1 ]。
8  int型の E、V、N、M、X、Y、R W [N]、[N]、C [N]、ヘッド[N]、FA [N]、SH [N]、SZ [N]、MA [N]、トップ[N]、ID [N]、LS [N * 40 ]、RS [N * 40 ]、[N * F 40 ] [ 2 ]。
9  チャー S [ 11 ]。
10  ボイドアドオン(int型のx、int型Y){
 11      エッジ[E] .nex = 頭部[X]。
12      エッジ[E] .TO = Y。
13      頭[X] = E ++ 14  }
 15  INTアップ(int型のx、int型 Y、INT P){
 16      であれば(P)リターン X + Y。
17      リターンMAX(X、Y)
18  }
 19  空隙更新(INT&K、int型の L、int型の R、int型のx、int型のY){
 20      であれば、K = ++(K!)V。
21      場合(lは== R){
 22          F [k]が[ 0 ] = F [K] [ 1 ] = yと、
23          リターン;
24      }
 25      であれば(X <= MID)更新(LS [k]は、L、中、X、Y)
26      他の更新(RS [k]は、中間+ 1 、R、X、Y)。
27      のためには、int型 i = 0 ; iは< 2 ; iは++)F [K] [i]は= 最大(F [LSは、[K] [I]、F [RSは、[K] [i]は、I)。
28  }
 29  INTクエリ(INT K、int型の L、int型の R、int型のx、int型の Y、INT P){
 30      であれば(!K)((X> R)||(L> Y)||)戻り 0 ;
31      であれば((X <= 1)&&(R <= Y))リターン[K] [P] F。
32      リターンアップ(クエリ(LS [k]は、L、中、X、Y、P)、クエリ(RS [k]は、中間+ 1 、R、X、Y、P)、P)。
33  }
 34の 空隙 DFS(int型 K、int型の F、int型の){
 35      FA [k]は= fは、
36個の      SH [K] =のS。
37      SZ [K] = 1 38      のためのint型 I =ヘッド[k]を、I = - !1 ; I = エッジ[I] .nex)
 39          であれば!(エッジ[I] .TO = F){
 40の              DFS(エッジ[I] .TO、K、S + 1 )。
41の              SZ [K] + = SZ [エッジ[I] .TO]。
42              であれば(SZ [MA [K] <SZ [エッジ[I] .TO])MA [K] = エッジ[I] .TO。
43          }
 44  }
 45  空隙 DFS2(int型 K、int型T){
 46      ID [K] = ++ X。
47      更新(R [C [] K]、1、N- 5 、X、W [K])。
48      トップ[k]は= Tと、
49      もし(MA [K])DFS2(MA [K]、T)。
50      のためにint型 I =ヘッド[k]を、I =! - 1 ; I = エッジ[i]は.nex)
 51          であれば((エッジ[I] .TO = FA [K])&&(エッジ[I]!。 !へ= MA [K]))DFS2(エッジ[I] .TO、エッジ[I] .TO)。
52  }
 53  INT CALC(INT K、int型のx、int型の Y、int型P){
 54      INT ANS = 0 55      一方(上面[X] =!トップ[Y]){
 56          であれば(SH [TOP [X] < SH [トップ[Y])スワップ(X、Y)
57の          ANS =最大(ANS、クエリ(K、1、N-5 、ID [トップ[X]、ID [X]、P)、P)。
58          X = FA [TOP [X]]。
59      }
 60      であれば(SH [X]> SH [Y])スワップ(X、Y)
61      リターンアップ(ANS、クエリ(K、1、N- 5 、ID [x]は、ID [Y]、P)、P)。
62  }
 63  INT メイン(){
 64      のscanf(" %D%dの"、&​​N、&M)。
65      のmemset(ヘッド、 - 1はsizeof (ヘッド))。
66      のためにint型 I = 1のscanf(; iが<= N I ++)は、 " %D%dの"、&​​W [i]は、&C [I])。
67      のためにint型 i = 1 ; iがN <; Iは++ ){
 68          のscanf(" %D%dの"、およびX&Y)。
69          追加(X、Y)
70          追加(Y、X)。
71      }
 72の      DFS(110 );
73      X = 0 74      DFS2(11 )。
75      のためにint型 I = 1 ; I <= M Iは++ ){
 76         scanf関数(" %sの%D%D "、S、およびX&Y)。
77          であれば(S [ 0 ] == ' Q ' ){
 78              のprintf(" %Dを\ n "、計算値(R [C [X]、X、Y、S [ 1 ] == ' S ' ));
79              続け;
80          }
 81          であれば(S [ 1 ] == ' W ')[X] = W yと;
82          {
 83              更新(R [C [X]、1、N- 5、ID [X]、0 );
84個の              C [X] = Y。
85          }
 86          更新(R [C [X]、1、N- 5 、ID [X]、W [X])。
87      }
 88 }
コードの表示

 

おすすめ

転載: www.cnblogs.com/PYWBKTDA/p/11249813.html