合鍵 (keys) - ioi-jp.org · •n頂点のうちk点に色を 塗り,...

34
合鍵 (Keys) IOI 2009 Bulgaria 銅メダル 東京大学医学部医学科5年 平野湧一郎 (nai) 2015年3月21日 情報オリンピック春合宿

Upload: others

Post on 07-Jul-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 合鍵 (Keys) - ioi-jp.org · •n頂点のうちk点に色を 塗り, •頂点に書いてある数+ 両端点が塗られた辺に 書いてある数 •の総和を最大化!

合鍵 (Keys) IOI 2009 Bulgaria 銅メダル東京大学医学部医学科5年

平野湧一郎 (nai)

2015年3月21日 情報オリンピック春合宿

Page 2: 合鍵 (Keys) - ioi-jp.org · •n頂点のうちk点に色を 塗り, •頂点に書いてある数+ 両端点が塗られた辺に 書いてある数 •の総和を最大化!

問題概要•社員N人中K人に合鍵を配る•全員1回ずつ外出する•錠が閉まっている時間を最大化しよう

Page 3: 合鍵 (Keys) - ioi-jp.org · •n頂点のうちk点に色を 塗り, •頂点に書いてある数+ 両端点が塗られた辺に 書いてある数 •の総和を最大化!

小課題1.N ≦ 20, M ≦ 100万

2.N ≦ 2000

Page 4: 合鍵 (Keys) - ioi-jp.org · •n頂点のうちk点に色を 塗り, •頂点に書いてある数+ 両端点が塗られた辺に 書いてある数 •の総和を最大化!

小課題1.N ≦ 20, M ≦ 100万

2.N ≦ 2000

Page 5: 合鍵 (Keys) - ioi-jp.org · •n頂点のうちk点に色を 塗り, •頂点に書いてある数+ 両端点が塗られた辺に 書いてある数 •の総和を最大化!

部分点解法1•合鍵の渡し方を全部試す•合鍵の渡し方を決めたときに,錠の開け閉めを最適化しよう!

Page 6: 合鍵 (Keys) - ioi-jp.org · •n頂点のうちk点に色を 塗り, •頂点に書いてある数+ 両端点が塗られた辺に 書いてある数 •の総和を最大化!

考察•隣り合った2人の出入りを考える•時刻aから時刻bまで錠を閉めることのできる条件は?

•⇨ 社員AとBの出入りで場合分け

a b 時刻

A B

in out

Page 7: 合鍵 (Keys) - ioi-jp.org · •n頂点のうちk点に色を 塗り, •頂点に書いてある数+ 両端点が塗られた辺に 書いてある数 •の総和を最大化!

(1) in-out 型• A,Bが合鍵を持っているかどうかによらず,常に錠を閉めることができる

a b 時刻

A B

in out

Page 8: 合鍵 (Keys) - ioi-jp.org · •n頂点のうちk点に色を 塗り, •頂点に書いてある数+ 両端点が塗られた辺に 書いてある数 •の総和を最大化!

(2) in-in 型• Bが合鍵を持っていればOK

a b 時刻

A B

in in

Page 9: 合鍵 (Keys) - ioi-jp.org · •n頂点のうちk点に色を 塗り, •頂点に書いてある数+ 両端点が塗られた辺に 書いてある数 •の総和を最大化!

(3) out-out 型• Aが合鍵を持っていればOK

a b 時刻

A B

out out

Page 10: 合鍵 (Keys) - ioi-jp.org · •n頂点のうちk点に色を 塗り, •頂点に書いてある数+ 両端点が塗られた辺に 書いてある数 •の総和を最大化!

(4) out-in 型• AとBの両方が合鍵を持っている必要がある

a b 時刻

A B

out in

Page 11: 合鍵 (Keys) - ioi-jp.org · •n頂点のうちk点に色を 塗り, •頂点に書いてある数+ 両端点が塗られた辺に 書いてある数 •の総和を最大化!

まとめ

A B 錠を閉められる条件

in out いつでも

in in Bに合鍵

out out Aに合鍵

out in A,B両方に合鍵

Page 12: 合鍵 (Keys) - ioi-jp.org · •n頂点のうちk点に色を 塗り, •頂点に書いてある数+ 両端点が塗られた辺に 書いてある数 •の総和を最大化!

部分点解法1•合鍵の渡し方を全て試す•隣り合う出入り全てに対し,上述の場合分けにより錠が閉められるかを判定

Page 13: 合鍵 (Keys) - ioi-jp.org · •n頂点のうちk点に色を 塗り, •頂点に書いてある数+ 両端点が塗られた辺に 書いてある数 •の総和を最大化!

さらに考察•合鍵を渡すことで,「錠を閉められる時間」が伸びるのは2パターン

(1)社員Aに合鍵を渡す

(2)社員A,Bの両方に合鍵を渡す

A A B

Page 14: 合鍵 (Keys) - ioi-jp.org · •n頂点のうちk点に色を 塗り, •頂点に書いてある数+ 両端点が塗られた辺に 書いてある数 •の総和を最大化!

グラフにする•社員それぞれが頂点のN頂点のグラフを作る

•頂点:(1)で得する時間•辺:(2)で得する時間

7

12

4

5

8

613

10

8

715 9

5

14

6

21

25

3

Page 15: 合鍵 (Keys) - ioi-jp.org · •n頂点のうちk点に色を 塗り, •頂点に書いてある数+ 両端点が塗られた辺に 書いてある数 •の総和を最大化!

問題の言い換え• N頂点のうちK点に色を塗り,

•頂点に書いてある数+両端点が塗られた辺に書いてある数

•の総和を最大化!

7

12

4

5

8

613

10

8

715 9

5

14

6

21

25

3K=3

Page 16: 合鍵 (Keys) - ioi-jp.org · •n頂点のうちk点に色を 塗り, •頂点に書いてある数+ 両端点が塗られた辺に 書いてある数 •の総和を最大化!

問題の言い換え• N頂点のうちK点に色を塗り,

•頂点に書いてある数+両端点が塗られた辺に書いてある数

•の総和を最大化!

7

12

4

5

8

613

10

8

715 9

5

14

6

21

25

3

→解けない ▂▅▇█▓▒░('ω')░▒▓█▇▅▂

K=3

Page 17: 合鍵 (Keys) - ioi-jp.org · •n頂点のうちk点に色を 塗り, •頂点に書いてある数+ 両端点が塗られた辺に 書いてある数 •の総和を最大化!

試しに描いてみよう!

Page 18: 合鍵 (Keys) - ioi-jp.org · •n頂点のうちk点に色を 塗り, •頂点に書いてある数+ 両端点が塗られた辺に 書いてある数 •の総和を最大化!

サンプル1

3

4

33 1

Page 19: 合鍵 (Keys) - ioi-jp.org · •n頂点のうちk点に色を 塗り, •頂点に書いてある数+ 両端点が塗られた辺に 書いてある数 •の総和を最大化!

とあるinput

4

22 0 1

3

31 4

41 1

23 1

20 0 2

21

1

31 1

7 3 3 8

Page 20: 合鍵 (Keys) - ioi-jp.org · •n頂点のうちk点に色を 塗り, •頂点に書いてある数+ 両端点が塗られた辺に 書いてある数 •の総和を最大化!

問題文をよく読む•今日は偶然にも,どの社員もちょうど 1回ずつ外出する.

Page 21: 合鍵 (Keys) - ioi-jp.org · •n頂点のうちk点に色を 塗り, •頂点に書いてある数+ 両端点が塗られた辺に 書いてある数 •の総和を最大化!

何が嬉しいか•頂点の次数は高々2•グラフに閉路が存在しない

時刻

Page 22: 合鍵 (Keys) - ioi-jp.org · •n頂点のうちk点に色を 塗り, •頂点に書いてある数+ 両端点が塗られた辺に 書いてある数 •の総和を最大化!

何が嬉しいか•頂点の次数は高々2•グラフに閉路が存在しない

時刻

Page 23: 合鍵 (Keys) - ioi-jp.org · •n頂点のうちk点に色を 塗り, •頂点に書いてある数+ 両端点が塗られた辺に 書いてある数 •の総和を最大化!

わかったこと•グラフに閉路や分岐なし→グラフはパスの集合

•※パス:みたいなもの

7

12

4

5

8

613

10

8

715 9

5

14

6

21

25

3

Page 24: 合鍵 (Keys) - ioi-jp.org · •n頂点のうちk点に色を 塗り, •頂点に書いてある数+ 両端点が塗られた辺に 書いてある数 •の総和を最大化!

さらに言い換え•パスがいくつかある•頂点と辺に数が書いてある•N頂点のうちK個に色を塗る•利益の合計を最大化しよう

Page 25: 合鍵 (Keys) - ioi-jp.org · •n頂点のうちk点に色を 塗り, •頂点に書いてある数+ 両端点が塗られた辺に 書いてある数 •の総和を最大化!

さらに言い換え•パスがいくつかある•頂点と辺に数が書いてある•N頂点のうちK個に色を塗る•利益の合計を最大化しよう

→解けそう ✌('ω'✌ )三✌('ω')✌三( ✌'ω')✌

Page 26: 合鍵 (Keys) - ioi-jp.org · •n頂点のうちk点に色を 塗り, •頂点に書いてある数+ 両端点が塗られた辺に 書いてある数 •の総和を最大化!

パスが1本のみの場合•頂点に左から順に1 .. Nの番号を付ける•「今見ている頂点」「今まで塗った頂点の数」「最後の頂点を選んだか」でDP

Page 27: 合鍵 (Keys) - ioi-jp.org · •n頂点のうちk点に色を 塗り, •頂点に書いてある数+ 両端点が塗られた辺に 書いてある数 •の総和を最大化!

パスがC本ある場合•パスに1 .. Cの番号を付ける•それぞれのパスに対し,「K個塗った時の最大利益」を各Kについて求めておく

•「今見ているパス」「今まで塗った頂点の数」でDP

Page 28: 合鍵 (Keys) - ioi-jp.org · •n頂点のうちk点に色を 塗り, •頂点に書いてある数+ 両端点が塗られた辺に 書いてある数 •の総和を最大化!

満点解法•考察でパスの問題に落としこむ• DP2回で解ける•O(N2)

Page 29: 合鍵 (Keys) - ioi-jp.org · •n頂点のうちk点に色を 塗り, •頂点に書いてある数+ 両端点が塗られた辺に 書いてある数 •の総和を最大化!

結論•考察が本質!•条件をうまく利用•小さいケースで実験•グラフに落としこむ

Page 30: 合鍵 (Keys) - ioi-jp.org · •n頂点のうちk点に色を 塗り, •頂点に書いてある数+ 両端点が塗られた辺に 書いてある数 •の総和を最大化!

得点分布

0

2

4

6

8

0 10 20 30 40 50 60 70 80 90 100

Page 31: 合鍵 (Keys) - ioi-jp.org · •n頂点のうちk点に色を 塗り, •頂点に書いてある数+ 両端点が塗られた辺に 書いてある数 •の総和を最大化!

おまけ

Page 32: 合鍵 (Keys) - ioi-jp.org · •n頂点のうちk点に色を 塗り, •頂点に書いてある数+ 両端点が塗られた辺に 書いてある数 •の総和を最大化!

端点の扱い•時刻Mに会社を出て,時刻0に会社に戻る変な社員N+1を作ればよい

0 M 時刻

Page 33: 合鍵 (Keys) - ioi-jp.org · •n頂点のうちk点に色を 塗り, •頂点に書いてある数+ 両端点が塗られた辺に 書いてある数 •の総和を最大化!

DP2回もしたくない•パスとパスを0の辺で結ぶ•パスが1本だと思ってDP•楽

0

0

0

Page 34: 合鍵 (Keys) - ioi-jp.org · •n頂点のうちk点に色を 塗り, •頂点に書いてある数+ 両端点が塗られた辺に 書いてある数 •の総和を最大化!

驚愕の事実•パスの端点以外に書かれた値はすべて0

•これを利用して計算量を下げることが可能?(できるとは言ってない)

0 0

0

0 0