ABC014 D.閉路

問題

無向木が与えられる。
クエリとして、頂点a,bが与えられるとき、aとbに辺を追加したら閉路ができる。このとき、閉路を形成する辺の数を返す。

V <= 10^5
Q <= 10^5

考え方

Qが10^5まであるので、O(n)な解法だと間に合わない。
頂点aから頂点bまでの距離がわかっていれば、それに+1したものが閉路の辺数になることがわかる。
これを高速に求められればよい。


根付き木の場合、2頂点の共通の祖先ノードで一番近いノードをLCA(最小共通祖先)という。
すると、(根から頂点aまでの深さ - 根からLCAまでの深さ) + (根から頂点bまでの深さ - 根からLCAまでの深さ)が頂点a,b間の距離になる。
ダブリングによる実装(参照:蟻本)の場合、構築がO(n log n)、探索がO(log n)なので、間に合う。
(根から頂点vまでの深さは、構築がO(n)、探索がO(1))


ちなみに、本番ではサボって、TarjanによるUnionFindとdfsによる解法(参照:spaghetti source)を使ったところ、TLEしてしまった。。。