【bzoj3626] LCA

全て呼掛け含むことが理解されるであろう〜R Lをルートノードへのパスがマークされている+1 タグを、次にクエリが対応する尋ねるZ 有するルートに多くのパス+1 マークが、この問題は、プレフィックスとオフライン処理にツリーを変換することができます。鎖セグメントツリーのメンテナンスのスプリットセット。

実際には、ブロックの一種であり、その前に答える各ブロックの各ノードに対して、各ブロックについて、に見出すことができるF [K] = F [FA] + SZ [k]は SZ [K] 表すk個のサブツリーのノード数、最初の前処理このブロック演算fは、暴力外部ブロック(データ構造のない組が、定数が大きいほど、通過しないかもしれない)、最後のブロック内で直接計算することができます。

1つの#include <ビット/ STDC ++ H>
 2  使用して 名前空間STDを、
3  の#define N 50005
 4  の#define L(K << 1)
 5  の#define R(L + 1)
 6  の#define中間(L + R >> 1)
 7  の構造体JI {
 8      int型のID、X、Y、Z。
9      ブール 演算子 <(CONSTの JI&A)のconst {
 10          リターン X < 斧。
11      }
 12 } Q [N << 1 ]。
13  構造体JI2 {
 14      INT隣に;
15 }エッジ[N << 1 ]。
16  int型 E、N、M、X、Y、Z、K、SZ [N]、FA [N]、トップ[N]、ID [N]、ANS [N]、MA [N]、ヘッド[N] 、Lazの[N << 2 ]、F [N << 2 ]。
17  ボイド追加(int型のx、int型のY){
 18      エッジ[E] .nex = 頭部[X]。
19      エッジ[E] .TO = Y。
20      頭[X] = E ++ 21  }
 22の 空隙 DFS(int型K){
 23      SZ [K] = 1 24      のためにint型 I =ヘッド[k]を、I = - !1; I = エッジ[I] .nex){
 25の         DFS(エッジ[I] .TO)。
26の          SZ [K] + = SZ [エッジ[I] .TO]。
27          であれば(SZ [エッジ[I] .TO]> SZ [MA [K])MA [K] = エッジ[I] .TO。
28      }
 29  }
 30  空隙 DFS2(int型 K、int型T){
 31      ID [K] = ++ X。
32      トップ[k]は= Tと、
33      であれば(MA [K])DFS2(MA [K]、T)。 
34      のためにint型 I =ヘッド[k]を、I =! - 1 ; I = エッジ[i]は.nex)
 35          場合、エッジ[I] .TO(=!MA [K])DFS2(エッジ[I] .TO、エッジ[I] .TO)。
36  }
 37  空隙アップ(int型 K、int型の P、int型の L、int型R){
 38      のLaz [K] + = P。
39      F [K] + = P *(R-L + 1 )。
40  }
 41  ボイドダウン(int型 K、int型の L、INT R){
 42      アップ(L、のLaz [k]は、L、MID)。
43      アップ(R、Lazの[K]、ミッド+ 1 、R)。
44      のLaz [K] = 0 ;
45  }
 46  ボイド更新(int型 K、int型の L、int型の R、int型のx、int型のY){
 47      であれば((L> Y)||(X> R))のリターン;
48      であれば((X <= 1)&&(R <= Y)){
 49          まで(K、1 、L、R)。
50          リターン;
51      }
 52      更新(L、L、中、X、Y)
53      更新(R、中間+ 1 、R、X、Y)。
54      F [K] = F [L] + F [R] +のLaz [K] *(R-L + 1 )。
55  }
 56  INTクエリ(INT K、int型の L、INTの R、int型のx、int型Y){
 57      であれば((L> Y)||(X> R))戻り 0 ;
58      であれば((X <= 1)&&(R <= Y))リターン[K] F。
59      ダウン(K、L、R)。
60      リターンクエリ(L、L、中、X、Y)+クエリ(R、中間+ 1 、R、X、Y)。
61  }
 62  INT CALC(INT K){
 63      INT S = 0 64      のために(あり、k; = FA [トップ[K]] K)S + =クエリ(11 、nは、ID [トップ[K]、ID [K])。
65      リターン秒;
66  }
 67  INT メイン(){
 68      のscanf(" %D%dの"、&​​N、&M)。
69      のmemset(ヘッド、 - 1はsizeof (ヘッド))。
70      のためには、int型、I = 2 ; iが<= N; iが++ ){
 71          のscanf(" %dの"、およびX)
72          (++追加X、I)。
73          FA [I] =のX。
74      }
 75の      DFS(1 )。
76      X = 0 77      DFS2(11 )。
78      のためにint型 I = 1 ; I <= M; iが++ ){
 79          のscanf(" %D%D%D "、およびX&Y、およびZ)。
80          であれば(X)Q [++ K] = JI {I、X、Z + 1、 - 1 }。
81          qは[++ k]はJI = {I、Y + 1、Z + 11 }。
82      }
 83      ソート(Q + 1、Q + K + 1 )。
84      のためのint型 I = 1、J =1 ; iが<= N; iが++ ){
 85          のためにint型 K = Iであり; kは、= FA [トップ[K])更新(K 11 、nは、ID [トップ[K]、ID [k]を);
86          のために(; Q [J] .X == I、J ++)ANS [Q [J] .ID] + = CALC(Q [J] .Y)* Q [J] .Z。
87      }
 88      のためのint型 I = 1 ; I <= M; iが++)のprintf(" %d個の\ n "、ANS [I]%201314を89 }
コードの表示

 

おすすめ

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