D 鉄道会社
@takayuta1999
問題概要
 𝑁頂点からなる重み付き木AとBが与えられる
 どちらも、1~𝑁の頂点がある
 異なる二頂点の組であって、どちらの木においてもpath
上の最大重みが等しくなるような組の数を求めよ。
解法
 path上の最大重みを求めるときにO(loglog)にする一般
的なテクを思い出す
 Union Find に小さい辺から入れていってつないでいけ
ばよさそう?
解法-part 1
 与えられた木を短い順に辺を加えていって、UFでrootど
うしをつなげて得られる木に組み替える
(同じ長さの辺は適当な順番で加えていく)
 そうするとどのような性質が見られるだろうか
Sample-1 A社
1
2 3
45
5
3
1
3
これを
Sample-1 A社
1
3
1
こうして
2
5
3
1
4
3
1
2
5
3
1→ →
→
最後にこれを加えると…
Sample-1 A社
こうじゃ
2
5
3
1
4
35
3
1
Sample-1 A社
諸事情により各頂点に対して、子に向
かって降りる辺を長さでソートする
2
5
3
1
4
3
5
3
1
例を見る
 このUFで組み替えた木の性質を見る
 一つ、pathの最大重みはLCAの右側の長さなり
 二つ、辺はそれを斬って分割される木の内、根を含まな
い方の木に含まれるいかなる辺以上の長さをもつ
 三つ、どの頂点においても、その頂点から子に向かって
出る辺は右に行くほど長くなる(長さが同じことも)
 四つ、この木の高さはO(logN)である
証明っぽいコメント
 一つ、二つはUnion Find でつなげる過程を見れば示せ
る
 三つ、はこうなるようにソートしたからそうでなきゃだめ
 四つ、はUnion Find で rank や node 数を見て親を決め
る際に高さが低くなるように組むからこれも成立
 以下、辺が小さい方から大きい方に行くのを右に行く、と
呼ぶことにして、左に行く、も同様にその逆の意味で使う
これらの性質を使って
 これらの性質を使って、実際に何組あるか数えていきた
い(だから、AとBにこの変換を施しておく)
 やっぱり木の高さがlogオーダーであることは強いので、
これを利用することを考える
 そうすると、頂点の組に対して、一方の頂点を固定して
被らないようにうまく何通りあるかが分かれば、数え上げ
られると分かる
 諸事情により、あらかじめ左から右に向かっての順番で
根から行きがけ順の値を計算しておきます
一方を固定して
 一方を固定してどうすれば、重複がないようにできるか
を考える
 このとき、以下の制限上で数え上げればよい
 まず、固定する頂点をAの木においてはaであり、Bの木
においてbであると表す(実際は同じ頂点ではあるが)
 このとき、aから考える経路としては、aから少なくとも1回
以上親に向かってのぼっていき、そこからそこに登って
行った辺よりも左側の辺に向かって降りていくものだけを
考えればよい
一方を固定して
 次に、bの動きとしては、aですでに重複が消されている
ので重複は考えなくていいが、以下の二つの場合分けを
する
 一つ、bから少なくとも1回以上登って行って、そこから左
へ0回以上曲がる
 二つ、bから少なくとも0回以上登って行って、そこから右
へ1回以上曲がる
場合分け(1)
 bから少なくとも1回以上登って行って、そこから左へ0回
以上曲がる
 このとき、以下のような図になる
A社 B社
場合分け(1)
 このとき、最大重みは以下のようになる
A社 B社
ここ
場合分け(1)
 つまり、曲がる位置を決めたら、そこから左にどこまで曲
がろうと、関係ない
 しかも、この木の性質、三つ、から曲がる位置はa,bとも
に、根までのpathにおいて連続的に存在するので、曲が
る先の頂点の集合の行きがけ順の値は連続している
 よって、それぞれの行きがけ順の区間を[x,y],[z,w]とした
とき、[x,y]にAでの行きがけ順が、[z,w]にBでの行きがけ
順が入っている頂点の個数を数えればよい
場合分け(2)
 bから少なくとも0回以上登って行って、そこから右へ1回
以上曲がる
 このとき、状況は以下のようになる
A社 B社
場合分け(2)
 このとき、最大重みは以下のようになる
A社 B社
ここ
場合分け(2)
 つまり、曲がる位置を決めたら、そこから左にどこまで曲
がろうと、関係ないが、bが右に曲がる位置は全部試す
と間に合わない
 そこで、この木の性質、二つ、三つ、を利用すると、曲が
るべき位置は行きがけ順で連続する
 よって、それぞれの行きがけ順の区間を[x,y],[z,w]とした
とき、[x,y]にAでの行きがけ順が、[z,w]にBでの行きがけ
順が入っている頂点の個数を数えればよい
まとめ
 すなわち、以上の二つの場合分けによって得られる行き
がけ順の区間をすべて計算すると、木の高さがO(logN)
より、そのような区間はO(NlogN)個なので、これらの区
間の組の両方に入っている頂点を数え上げればよい
 これは、N個の頂点を(Aの行きがけ順、Bの行きがけ順)
で点とみなして、区間の組を長方形とみなすと、長方形
内に含まれる点の数を数えあげる問題に帰着される
まとめ
 これは、O((長方形と点)*logN)でできるので、つまり、全
体としての計算量はO(Nlog^2N)で解くことができる
 めでたしめでたし
 (部分点については省略します)

IJPC-2 D問題解説