定義し、理解して1:
配列は、ツリー構造は、直鎖構造に注文することができるときに発生木のシーケンススタンプDFS深さ優先トラバーサルであるので、線形問題ツリーに問題
この時、私たちは木問題に対処するので、簡単なメンテナンス間隔のセグメントツリー、ツリーアレイ、として良いデータ構造の多くを使用してすることができます!
2.重要プロパティ
(1)[X]表す第一のタイムスタンプDFS Xノード、アウト[X]はに対応するタイムスタンプを表し、出口ノードx時間からタイムスタンプ、NUM [時間]を表しに設けられています
どのツリーノードです。特徴は、配列は、取得した私たちの新しいシーケンスは線状配列ノードたNUM DFSです。
明らかに、ルート・サブツリーにノードXは、必ずしも連続した区間を占める[[x]の中で[X]、およびこの間隔風雲内のすべてのノードはじめにDFSにおける全てのサブサブツリーノード。
コード:
DFSの空隙(U int型、INT FA)
{
[U] = CNT ++で、//は、xにタイムスタンプを記録する
[CNT] = U DFS; //更新シーケンスは、DFS
INT Vを; //
(INTのために私はヘッド= [U]; I; Iは= E [I] .next)
{
V = E [I] .TO;
IF(V = FA)!
のDFS(V、U); //検索サブツリー
}
OUT [U] = ++ CNT; x軸から//レコードのタイムスタンプ
DFS [CNT] = U; //更新シーケンスDFS
}
(2)一つの問題:変形の一点、及びサブツリークエリ:
DFSは直接ノードX対応DFS上の一点にシーケンス値は、サブツリーと要求間隔を変更して、ツリーまたは配列セグメントツリーメンテナンスをすることができる検討され、ツリー全体の配列を決定しました!
第二の問題:ツリー鎖修飾、問い合わせのシングルポイント:
そのようなプラス全てとして(U、V)ノードの間の修正値
だから我々は動作するように4つの鎖は考えます!
考虑のu --->ルート、V --->ルート、LCA(U、V)--->ルート、FA(LCA紫外線(UV))--->ルート!
我々は、すべてのフロント二つの経路上の点、すべての二つの経路のマイナスポイントを追加します
このツリーは、配列DFSの配列に対応する各ノードに順次重みに対応する、配列DFS配列を維持するために使用することができます!
その後、修正?フェンウィックツリーは、実際の順序とプレフィックスDFSの重量によって維持されています!
get_sum(x)は、差動プレフィックス1-Xを表します
(L [U])を追加し、(L [V])を追加し、(LCA(U、V)、 - )を追加し、追加(FA(LCA(U、V))を - );
ヴァル(X)= get_sum(R [X]) - get_sum(L [X] -1)。
質問3:重量サブツリーは、全体的なだけでなく、単一の点として、重みのルートに、クエリの一点を修正し、
例えば、我々は、サブツリーのルートに加えて全体にノードをxは
我々は、すべてのノードは、2つの値を維持します
これはタグであり、他のノードの自重です。
我々は2つの動作モードを提供します。
1)単一の点を直接変更します
2)Xプラス全体をルートとするサブツリーであろう
操作1、増加すべての点、タグ+ =、そのノード自身の重量のために操作2の一点への直接修飾、 - (DEP [X] -1)*; Xとしてこれを打ち消すためにありませんルート
サブツリーノード内に貢献!ルートに重みとノードyを掲載し、我々は返さ:タグ* DEP [Y] + valの[Y];
その後、操作をすることができます!
例:POJ3321 https://www.cnblogs.com/shenben/p/5764932.html
羅区:P3178ツリー操作