Slide 1

Slide 1 text

いろいろな問題の解説 Masaki Hara IOI2013直前合宿にて

Slide 2

Slide 2 text

目次 • Hotter Colder (IOI 2010) • SaveIt (IOI 2010) • Parrots (IOI 2011) • Maze (IOI 2010) • Disparity (JOI Open 2013)

Slide 3

Slide 3 text

Hotter Colder • 1以上N以下の整数を当てたい • 1以上N以下の整数を質問する • 直前に聞いたときよりも近いか遠いかがわか る • できるだけ少ない回数で当てたい

Slide 4

Slide 4 text

Hotter Colder • 考察 △ △ 直前に質問した位置 今回質問した位置

Slide 5

Slide 5 text

Hotter Colder • 考察 △ ● △ 直前に質問した位置 今回質問した位置 Colder

Slide 6

Slide 6 text

Hotter Colder • 考察 △ ● △ 直前に質問した位置 今回質問した位置 Same

Slide 7

Slide 7 text

Hotter Colder • 考察 △ ● △ 直前に質問した位置 今回質問した位置 Hotter

Slide 8

Slide 8 text

Hotter Colder • 考察 Colder Same Hotter 直前に質問した位置 今回質問した位置

Slide 9

Slide 9 text

Hotter Colder • 考察 Colder Same Hotter 直前に質問した位置 今回質問した位置

Slide 10

Slide 10 text

Hotter Colder • 考察 • 大きいか小さいかがわかる • 基準: (直前のクエリ + 今回のクエリ) / 2

Slide 11

Slide 11 text

Hotter Colder • 普通の「大きい/小さい」問題との違い

Slide 12

Slide 12 text

Hotter Colder • 普通の「大きい/小さい」問題との違い – 思った通りの質問ができないことがある – 例1: 直前に5を質問しているときに5との大小 – 例2: 直前に5を質問しているときに1との大小

Slide 13

Slide 13 text

Hotter Colder • 対策

Slide 14

Slide 14 text

Hotter Colder • 対策1: 1クエリに2回質問する – こうすれば必ず好きな質問ができる • (50点)

Slide 15

Slide 15 text

Hotter Colder • 対策2: 大きい/小さい/同じ の3値情報である ことを利用する – クエリの回数を少しだけ減らせる • (75点)

Slide 16

Slide 16 text

Hotter Colder • 満点解法

Slide 17

Slide 17 text

Hotter Colder • 満点解法を考える前に、小さいケースで試す

Slide 18

Slide 18 text

Hotter Colder • 問題 – Nが与えられたとき、質問回数を最小化しなさい – N <= 100

Slide 19

Slide 19 text

Hotter Colder • 問題 – Nが与えられたとき、質問回数を最小化しなさい – N <= 100 • 解答 – DP – dp[直前の質問,絞り込んだ範囲] =そこからの質問回数

Slide 20

Slide 20 text

Hotter Colder • これを実際に実行するとわかること – 十分小さいときは、1→3→5→7の順番で質問する のが良い – それより大きいときは、 = 3 ⋅ 2 − 1のときが一 番効率がよい

Slide 21

Slide 21 text

Hotter Colder • = 3 ⋅ 2 − 1 の場合の戦略

Slide 22

Slide 22 text

Hotter Colder • = 3 ⋅ 2 − 1 の場合の戦略 23 − 1個 23 − 1個 23 − 1個

Slide 23

Slide 23 text

Hotter Colder • = 3 ⋅ 2 − 1 の場合の戦略 23 − 1個 23 − 1個 23 − 1個 ● 1回目の質問

Slide 24

Slide 24 text

Hotter Colder • = 3 ⋅ 2 − 1 の場合の戦略 23 − 1個 23 − 1個 23 − 1個 ● ● 1回目の質問 2回目の質問

Slide 25

Slide 25 text

Hotter Colder • = 3 ⋅ 2 − 1 の場合の戦略 23 − 1個 23 − 1個 23 − 1個 ● ● 1回目の質問 2回目の質問

Slide 26

Slide 26 text

Hotter Colder • = 3 ⋅ 2 − 1 の場合の戦略 23 − 1個 23 − 1個 23 − 1個 ● ● ● 1回目の質問 2回目の質問 3回目の質問

Slide 27

Slide 27 text

Hotter Colder • = 3 ⋅ 2 − 1 の場合の戦略 23 − 1個 23 − 1個 23 − 1個 ● ● ● 1回目の質問 2回目の質問 3回目の質問 両方右側に進んだ場合: 右端で2分探索 (毎回のクエリを必ず実行できる)

Slide 28

Slide 28 text

Hotter Colder • = 3 ⋅ 2 − 1 の場合の戦略 23 − 1個 23 − 1個 23 − 1個 ● ● ● 1回目の質問 2回目の質問 3回目の質問 右左の順に進んだ場合: 中央で2分探索 (毎回のクエリを必ず実行できる)

Slide 29

Slide 29 text

Hotter Colder • = 3 ⋅ 2 − 1 の場合の戦略 23 − 1個 23 − 1個 23 − 1個 ● ● 1回目の質問 2回目の質問 最初に左に進んだ場合: 左端で2分探索 (2回目の結果は使わない)

Slide 30

Slide 30 text

Hotter Colder • これによりどの場合でも均等に効率よくクエリ を消費することができる

Slide 31

Slide 31 text

Hotter Colder • これによりどの場合でも均等に効率よくクエリ を消費することができる • あとは、境界条件に注意しながらNが一般の 場合に拡張する(結構むずい)

Slide 32

Slide 32 text

Hotter Colder • Hotter Colder 教訓: 実験は大事

Slide 33

Slide 33 text

SaveIt • グラフ中の最短経路を何セットか求めたい – 高々1000個の頂点と高々36個のハブの間の最 短経路たちを求めたい • 通信計算量を小さくしてね – 質問をそのまま送っても、答えをそのまま送って も、損失が出る

Slide 34

Slide 34 text

SaveIt • グラフ中の最短経路を何セットか求めたい – 高々1000個の頂点と高々36個のハブの間の最 短経路たちを求めたい • 通信計算量を小さくしてね – 質問をそのまま送っても、答えをそのまま送って も、損失が出る

Slide 35

Slide 35 text

SaveIt • 質問をそのまま送る: 25点 • 答えをそのまま送る: 50点

Slide 36

Slide 36 text

SaveIt • 共通する構造を抜き出す • 差分をとることで情報を圧縮する • ということから、次のように考える

Slide 37

Slide 37 text

SaveIt • 全域木を1つ決める • ハブとの距離は、親との差分で定める

Slide 38

Slide 38 text

SaveIt • 全域木を1つ決める • ハブとの距離は、親との差分で定める

Slide 39

Slide 39 text

SaveIt • 全域木を1つ決める • ハブとの距離は、親との差分で定める 2 1 0 1 1 2

Slide 40

Slide 40 text

SaveIt • 全域木を1つ決める • ハブとの距離は、親との差分で定める +1 -1 +1 -1 0

Slide 41

Slide 41 text

SaveIt • 全域木の情報 – ノード数1000 × ノード番号10bit = 10000bit • ハブからの距離 – ハブ数36 × ノード数1000 × 差分2bit = 72000bit

Slide 42

Slide 42 text

SaveIt • 全域木の情報 – ノード数1000 × ノード番号10bit = 10000bit • ハブからの距離 – ハブ数35 × ノード数1000 × 差分2bit = 70000bit • 全域木を、ハブ0からのBFSで構築すると、情 報を節約できる • (75点)

Slide 43

Slide 43 text

SaveIt • 全域木の情報 – ノード数1000 × ノード番号10bit = 10000bit • ハブからの距離 – ハブ数36 × ノード数1000 × 差分5/3bit = 60000bit • 差分は3通りなので3つまとめて5bitで送れる • (100点)

Slide 44

Slide 44 text

Parrots • オウムに乗せてデータを送る • データの到着順はわからない

Slide 45

Slide 45 text

Parrots • SaveItのパクリっぽい問題 • 何か良い圧縮方法がある?

Slide 46

Slide 46 text

Parrots • SaveItのパクリっぽい問題 • 何か良い圧縮方法がある?

Slide 47

Slide 47 text

Parrots • SaveItのパクリっぽい問題 • 何か良い圧縮方法がある?

Slide 48

Slide 48 text

Parrots • SaveItのパクリっぽい問題 • 何か良い圧縮方法がある?

Slide 49

Slide 49 text

Parrots • 単に番号をつければいい

Slide 50

Slide 50 text

Parrots • 単に番号をつければいい 状況 番号 オウム0羽 0 オウム1羽(0) 1 : : オウム1羽(255) 256 オウム2羽(0,0) 257 オウム2羽(0,1) 258 : :

Slide 51

Slide 51 text

Parrots • どのように番号をつけるか?

Slide 52

Slide 52 text

Parrots • どのように番号をつけるか? • 前処理: 常に一定数のオウムを送るものとし て扱う(送らない分は256というデータだと考え る)

Slide 53

Slide 53 text

Parrots • どのように番号をつけるか? • 「y未満の自然数x個からなる単調非減少列」 を考えればよい • これは何個あるか?

Slide 54

Slide 54 text

Parrots • どのように番号をつけるか? • 「y未満の自然数x個からなる単調非減少列」 を考えればよい • これは何個あるか? • 実は、 + 個ある

Slide 55

Slide 55 text

Parrots • 証明 – = 0のとき、空の列はちょうど1通り。 – = 0のとき、0からなる列はちょうど1通り。 – 数列の末尾が − 1に等しい場合の列は帰納法 の仮定より + − 1 − 1 通り 一方、それ以外の場合の列は帰納法の仮定より + − 1 通り なので帰納法より正しい

Slide 56

Slide 56 text

Parrots • この証明と同じ手順で符号化・復号ができる

Slide 57

Slide 57 text

Parrots • この証明と同じ手順で符号化・復号ができる

Slide 58

Slide 58 text

Parrots / SaveIt • Parrots / SaveIt 教訓: – SaveItみたいに発想力が試されるものもある – でもParrotsみたいにただ対応させるだけというも のもある

Slide 59

Slide 59 text

Maze • 畑を切り開いて迷路を作ります • 幅優先探索したときの深さを大きくしたい • 切り開ける場所と切り開けない場所がありま す • 10問

Slide 60

Slide 60 text

Maze • 困難な最適化問題の一般的なテク

Slide 61

Slide 61 text

Maze • 困難な最適化問題の一般的なテク – 基本は局所探索

Slide 62

Slide 62 text

Maze • 困難な最適化問題の一般的なテク – 基本は局所探索 – ランダム要素を加えて局所探索+繰り返し試行 がオススメ • 実装が簡単 • 時間をかければ多少は改善するようになる

Slide 63

Slide 63 text

Maze • 困難な最適化問題の一般的なテク – 基本は局所探索 – ランダム要素を加えて局所探索+繰り返し試行 がオススメ – 少し工夫したいならSAっぽいことをやると良い

Slide 64

Slide 64 text

Maze • 困難な最適化問題の一般的なテク – 基本は局所探索 – ランダム要素を加えて局所探索+繰り返し試行 がオススメ – 職人の技が光るところ • 近傍の定め方 • 評価関数の定め方 • 焼きなまし等のパラメーター

Slide 65

Slide 65 text

Maze • 入力の傾向

Slide 66

Slide 66 text

Maze • Field1 – むっちゃ簡単

Slide 67

Slide 67 text

Maze • Field2,4 – 簡単そう

Slide 68

Slide 68 text

Maze • Field2 – これはよく見るとどうやって生成したかわかる

Slide 69

Slide 69 text

Maze • Field3,5 – 格子が入っている

Slide 70

Slide 70 text

Maze • Field3,5 – 格子が入っている – NP困難性の証明に使われた?

Slide 71

Slide 71 text

Maze • Field7,8 – 小さい

Slide 72

Slide 72 text

Maze • Field6,9 – まっしろ

Slide 73

Slide 73 text

Maze • FieldA – おおきい

Slide 74

Slide 74 text

Maze • FieldAの特徴: 大域的な探索をうまくする必 要があって難しい – 手でやる?

Slide 75

Slide 75 text

Maze • FieldAの特徴: 大域的な探索をうまくする必 要があって難しい – 手でやる? – 手で大域的な解を作って局所探索をするという手 もある

Slide 76

Slide 76 text

Maze • FieldAの特徴: 大域的な探索をうまくする必 要があって難しい – 手でやる? – 手でやる場合の注意: 斜めに進んだほうが効率 的

Slide 77

Slide 77 text

Disparity • 有権者の数ができるだけ均等になるように小 選挙区を定めて下さい • 5問

Slide 78

Slide 78 text

Disparity • データの傾向

Slide 79

Slide 79 text

Disparity • データの傾向 – 01,03,05

Slide 80

Slide 80 text

Disparity • データの傾向 – 04

Slide 81

Slide 81 text

Disparity • データの傾向 – 04

Slide 82

Slide 82 text

Disparity • データの傾向 – 02

Slide 83

Slide 83 text

Disparity • 近傍の定め方 • 以下の近傍はどうか?

Slide 84

Slide 84 text

Disparity • 近傍の定め方 • 以下の近傍はどうか? • あんまり良くない(幅が大きすぎて微調整がき かない)

Slide 85

Slide 85 text

Disparity • 近傍を次のようにとる 境界10個くらいを抽出 一番良い境界を探す

Slide 86

Slide 86 text

Disparity • 評価関数の定め方:disparityそのものを評価 関数とする?

Slide 87

Slide 87 text

Disparity • 評価関数の定め方:disparityそのものを評価 関数とする? – 最大の地域・最小の地域を動かさないと評価に 反映されない

Slide 88

Slide 88 text

Disparity • 評価関数の定め方:disparityそのものを評価 関数とする? – 最大の地域・最小の地域を動かさないと評価に 反映されない – 例えば:分散を使うと勾配がきれいにつく

Slide 89

Slide 89 text

まとめ • これをやれば良いという定石はあんまないっ ぽい

Slide 90

Slide 90 text

まとめ • これをやれば良いという定石はあんまないっ ぽい • せっかくなので楽しんで