説明
がんばると、Link-Cut木で部分木に対するクエリも処理できるようになる。
普通のLink-Cut木と同様に遅延評価もできる気がするが, そのような問題を見たことないので未実装。
計算量
実装例
テンプレートの第一引数には、載せたいデータを定義した構造体を渡す。構造体では、以下の関数を定義すること。基本的にメンバ変数には部分木全体のdata、Light-Edgeのみのdata($key$とLight-Edgeのみのdataと$parent$と$child$を使ってマージしたものが部分木全体のdataとなるイメージ) が必要。
- merge($key$, $parent$, $child$) := そのノードの値 $key$ と、$parent$(親, 左部分木), $child$(子, 右部分木) をマージする。
- toggle() := そのノードの親と子を入れ替える。
- add($child$) := $child$ をLight-Edgeでそのノードに繋ぐ
- erase($child$) := Light-Edge で繋がっていた $child$ をそのノードから削除する
検証
Codeforces Round #564 (Div. 1) E. Nauuo and ODT
技術室奥プログラミングコンテスト J - 仕事をしよう! (Working!)
その他いろいろ
QTREE LCT + Dynamic Distance Sum
参考
Link Cut Treeで部分木の情報を管理する - beet’s soil