ijpc-2 d問題解説

21
D 鉄鉄鉄鉄 @takayuta1999

Upload: yutaka1999

Post on 26-Jan-2017

418 views

Category:

Science


0 download

TRANSCRIPT

Page 1: IJPC-2 D問題解説

D 鉄道会社@takayuta1999

Page 2: IJPC-2 D問題解説

問題概要 頂点からなる重み付き木 A と B が与えられる どちらも、の頂点がある 異なる二頂点の組であって、どちらの木においても

path 上の最大重みが等しくなるような組の数を求めよ。

Page 3: IJPC-2 D問題解説

解法 path 上の最大重みを求めるときに O(loglog) にする一般的なテクを思い出す Union Find に小さい辺から入れていってつないでいけばよさそう ?

Page 4: IJPC-2 D問題解説

解法 -part 1 与えられた木を短い順に辺を加えていって、 UF で

root どうしをつなげて得られる木に組み替える (同じ長さの辺は適当な順番で加えていく) そうするとどのような性質が見られるだろうか

Page 5: IJPC-2 D問題解説

Sample-1 A 社1

2 3

45

5

3

1

3

これを

Page 6: IJPC-2 D問題解説

Sample-1 A 社1

31

こうして

2

53

1

43

1

25

3

1

最後にこれを加えると…

Page 7: IJPC-2 D問題解説

Sample-1 A 社

こうじゃ

2

53

1

435

31

Page 8: IJPC-2 D問題解説

Sample-1 A 社

諸事情により各頂点に対して、子に向かって降りる辺を長さでソートする

2

53

1

43

53

1

Page 9: IJPC-2 D問題解説

例を見る この UF で組み替えた木の性質を見る 一つ、 path の最大重みは LCA の右側の長さなり 二つ、辺はそれを斬って分割される木の内、根を含まない方の木に含まれるいかなる辺以上の長さをもつ 三つ、どの頂点においても、その頂点から子に向かって出る辺は右に行くほど長くなる(長さが同じことも) 四つ、この木の高さは O(logN) である

Page 10: IJPC-2 D問題解説

証明っぽいコメント 一つ、二つは Union Find でつなげる過程を見れば示せる 三つ、はこうなるようにソートしたからそうでなきゃだめ 四つ、は Union Find で rank や node 数を見て親を決める際に高さが低くなるように組むからこれも成立 以下、辺が小さい方から大きい方に行くのを右に行く、と呼ぶことにして、左に行く、も同様にその逆の意味で使う

Page 11: IJPC-2 D問題解説

これらの性質を使って これらの性質を使って、実際に何組あるか数えていきたい(だから、 A と B にこの変換を施しておく) やっぱり木の高さが log オーダーであることは強いので、これを利用することを考える そうすると、頂点の組に対して、一方の頂点を固定して被らないようにうまく何通りあるかが分かれば、数え上げられると分かる 諸事情により、あらかじめ左から右に向かっての順番で根から行きがけ順の値を計算しておきます

Page 12: IJPC-2 D問題解説

一方を固定して 一方を固定してどうすれば、重複がないようにできるかを考える このとき、以下の制限上で数え上げればよい まず、固定する頂点を A の木においては a であり、

B の木において b であると表す(実際は同じ頂点ではあるが) このとき、 a から考える経路としては、 a から少なくとも 1 回以上親に向かってのぼっていき、そこからそこに登って行った辺よりも左側の辺に向かって降りていくものだけを考えればよい

Page 13: IJPC-2 D問題解説

一方を固定して 次に、 b の動きとしては、 a ですでに重複が消されているので重複は考えなくていいが、以下の二つの場合分けをする

一つ、 b から少なくとも 1 回以上登って行って、そこから左へ 0 回以上曲がる 二つ、 b から少なくとも 0 回以上登って行って、そこから右へ 1 回以上曲がる

Page 14: IJPC-2 D問題解説

場合分け (1) b から少なくとも 1 回以上登って行って、そこから左へ 0 回以上曲がる このとき、以下のような図になる

A 社 B 社

Page 15: IJPC-2 D問題解説

場合分け (1) このとき、最大重みは以下のようになる

A 社 B 社

ここ

Page 16: IJPC-2 D問題解説

場合分け (1) つまり、曲がる位置を決めたら、そこから左にどこまで曲がろうと、関係ない しかも、この木の性質、三つ、から曲がる位置は

a,b ともに、根までの path において連続的に存在するので、曲がる先の頂点の集合の行きがけ順の値は連続している よって、それぞれの行きがけ順の区間を [x,y],[z,w]としたとき、 [x,y] に A での行きがけ順が、 [z,w]に B での行きがけ順が入っている頂点の個数を数えればよい

Page 17: IJPC-2 D問題解説

場合分け (2) b から少なくとも 0 回以上登って行って、そこから右へ 1 回以上曲がる このとき、状況は以下のようになる

A 社 B 社

Page 18: IJPC-2 D問題解説

場合分け (2) このとき、最大重みは以下のようになる

A 社 B 社

ここ

Page 19: IJPC-2 D問題解説

場合分け (2) つまり、曲がる位置を決めたら、そこから左にどこまで曲がろうと、関係ないが、 b が右に曲がる位置は全部試すと間に合わない そこで、この木の性質、二つ、三つ、を利用すると、曲がるべき位置は行きがけ順で連続する よって、それぞれの行きがけ順の区間を [x,y],[z,w]としたとき、 [x,y] に A での行きがけ順が、 [z,w]に B での行きがけ順が入っている頂点の個数を数えればよい

Page 20: IJPC-2 D問題解説

まとめ すなわち、以上の二つの場合分けによって得られる行きがけ順の区間をすべて計算すると、木の高さが

O(logN) より、そのような区間は O(NlogN) 個なので、これらの区間の組の両方に入っている頂点を数え上げればよい これは、 N 個の頂点を (A の行きがけ順、 B の行きがけ順)で点とみなして、区間の組を長方形とみなすと、長方形内に含まれる点の数を数えあげる問題に帰着される

Page 21: IJPC-2 D問題解説

まとめ これは、 O(( 長方形と点) *logN) でできるので、つまり、全体としての計算量は O(Nlog^2N) で解くことができる めでたしめでたし

(部分点については省略します)