beet's soil

競プロのことなど

TopTree には何が載るのか

調べてみました!

前提知識

何箇所かミスがあるけど大体わかる にうくん 直してね ありがとう
niuez.github.io

dummyを追加することにします。
すると、Rakeのときの端は必ずdummyなので必要なくなります。
また、soft_exposeをするとき、連結で頂点数が2以上なので両方の次数が必ず2以上になります。
exposeしたあと、両端はかならずdummyになっています

おきもち

noshi91.hatenablog.com

にもあるように、TopTreeではClusterを管理します。Clusterってなんだよ

これは完全に僕のイメージなので信用ならないんですが、
Clusterはパスと、その内部から伸びているClusterをまとめたものです

f:id:beet_aizu:20200402134803p:plain

一本一本の矢印がClusterを表しています。
図からわかるように、Clusterは両端を結ぶ矢印(有向)にClusterが再帰的に突き刺さっているようなものです。

一番単純なClusterはEdgeです
f:id:beet_aizu:20200402142544p:plain

明らかに辺属性の方が扱いやすいことがわかると思います。頂点属性も頑張ればできます(めんどいですが)

パスクエリ(辺属性)

これは一番楽です 
Compressでマージします
Rakeではぶら下がってる方を無視します

頑張れば遅延伝播とかもできます LCTとほぼ同じ

パスクエリ(頂点属性)

Compressのときにいい感じにやればできます
長さ0のパスを場合分けするのとsoft_exposeのあと両端が無視されてるのを反映するのを忘れずに
beet-aizu.github.io

部分木クエリ(辺属性)

問題見たことなし 流石にできると思います(王者の風格)

部分木クエリ(頂点属性)

これも簡単 可換性要求しないとお話にならないので仮定すると、CompressもRakeも足すだけです
beet-aizu.github.io

ある頂点を根としたときの部分木は


のように表現されています

最遠点クエリ

がんばるとできます(説明放棄)
beet-aizu.github.io

indexも取れます でも葉木になったせいか定数倍がア
beet-aizu.github.io

最小シュタイナー木クエリ

…(無言)
beet-aizu.github.io

niuez.hatenablog.com
全完阻止じゃあないんだよね

重心クエリ

TopTree上のノードを上から探索して、最終的な頂点をexposeすると、なんと計算量が償却されています!w

距離の和の最小値クエリと組み合わせることが多いです
beet-aizu.github.io
beet-aizu.github.io

なんかパスにぶら下がっているクエリ

何が載るのかさっぱり分からないぜ
beet-aizu.github.io
atcoder.jp
(この提出だけ使ってるライブラリが微妙に古い)