algo — C++23 日本語リファレンス GitHub

DynamicTopTree

クラス · Dynamic Top Tree(Link/Cut/Evert に対応した全方位木 DP)

template <class TreeDP>
struct DynamicTopTree;

概要

Dynamic Top Tree(Link/Cut/Evert に対応した全方位木 DP)

LCT の compress パス(splay 木)に加え、各頂点にぶら下がる軽辺 (rake 対象の部分木)を別の splay 木で束ねて expose のたびに $O(\log n)$ 償却で繋ぎ替える。evert によるパス反転に対応するため、 パス集約を正方向 sum・逆方向 mus の 2 本立てで保持する(compress が非可換なため、反転を高速に行うにはこの複製が必要)。 TreeDP のインターフェースは StaticTopTreeDP(tree_dp concept)と共通: Path vertex(int u) / Path add_vertex(Path d, Light l) / Light add_edge(Path d) / Light rake(Light l, Light r) / Path compress(Path p, Path c)。

計算量

構築・破棄

名前 説明 計算量
(constructor) (1) 空のDynamic Top Treeを構築する
(2) n個の孤立頂点とTreeDPを構築する
(1) $O(1)$
(2) $O(n)$

メンバ関数

名前 説明 計算量
link c を子、p を親として連結する(内部で c を自身の根に evert してから繋ぐ) 償却 $O(\log n)$
cut (1) c を親から切り離す
(2) 辺 (u, v) を切り離す
償却 $O(\log n)$
evert u を全体の根にする 償却 $O(\log n)$
update 頂点 u の情報が変化した後に呼び、集約を再計算する 償却 $O(\log n)$
query u を根としたときの木全体の集約値 償却 $O(\log n)$
query_subtree root を根としたときの、u を根とする部分木の集約値 償却 $O(\log n)$

メンバ型

名前 説明 計算量
Path path clusterの集約型 型エイリアスで実行時計算量はない
Light light edge clusterの集約型 型エイリアスで実行時計算量はない

メンバの詳細

(constructor)

// (1)
DynamicTopTree() = default;

// (2)
explicit DynamicTopTree(int n, const TreeDP &_dp = TreeDP());

(1) 空のDynamic Top Treeを構築する

(2) n個の孤立頂点とTreeDPを構築する

cut

// (1)
void cut(int c);

// (2)
void cut(int u, int v);

(1) c を親から切り離す

(2) 辺 (u, v) を切り離す