調べてみました!
前提知識
何箇所かミスがあるけど大体わかる にうくん 直してね ありがとう
niuez.github.io
dummyを追加することにします。
すると、Rakeのときの端は必ずdummyなので必要なくなります。
また、soft_exposeをするとき、連結で頂点数が2以上なので両方の次数が必ず2以上になります。
exposeしたあと、両端はかならずdummyになっています
おきもち
にもあるように、TopTreeではClusterを管理します。Clusterってなんだよ
これは完全に僕のイメージなので信用ならないんですが、
Clusterはパスと、その内部から伸びているClusterをまとめたものです
一本一本の矢印がClusterを表しています。
図からわかるように、Clusterは両端を結ぶ矢印(有向)にClusterが再帰的に突き刺さっているようなものです。
一番単純なClusterはEdgeです
明らかに辺属性の方が扱いやすいことがわかると思います。頂点属性も頑張ればできます(めんどいですが)
パスクエリ(辺属性)
これは一番楽です
Compressでマージします
Rakeではぶら下がってる方を無視します
頑張れば遅延伝播とかもできます LCTとほぼ同じ
パスクエリ(頂点属性)
Compressのときにいい感じにやればできます
長さ0のパスを場合分けするのとsoft_exposeのあと両端が無視されてるのを反映するのを忘れずに
beet-aizu.github.io
部分木クエリ(辺属性)
問題見たことなし 流石にできると思います(王者の風格)
部分木クエリ(頂点属性)
これも簡単 可換性要求しないとお話にならないので仮定すると、CompressもRakeも足すだけです
beet-aizu.github.io
ある頂点を根としたときの部分木は
のように表現されています
重心クエリ
TopTree上のノードを上から探索して、最終的な頂点をexposeすると、なんと計算量が償却されています!w
距離の和の最小値クエリと組み合わせることが多いです
beet-aizu.github.io
beet-aizu.github.io
なんかパスにぶら下がっているクエリ
何が載るのかさっぱり分からないぜ
beet-aizu.github.io
atcoder.jp
(この提出だけ使ってるライブラリが微妙に古い)