ijpc-2 d問題解説
TRANSCRIPT
D 鉄道会社@takayuta1999
問題概要 頂点からなる重み付き木 A と B が与えられる どちらも、の頂点がある 異なる二頂点の組であって、どちらの木においても
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
31
こうして
2
53
1
43
1
25
3
1
最後にこれを加えると…
Sample-1 A 社
こうじゃ
2
53
1
435
31
Sample-1 A 社
諸事情により各頂点に対して、子に向かって降りる辺を長さでソートする
2
53
1
43
53
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) で解くことができる めでたしめでたし
(部分点については省略します)