81
Donuts プロコンチャレンジ2015 解説 株式会社 Donuts 久野慎弥( @kuno4n

Donutsプロコンチャレンジ 2015 解説

  • Upload
    kuno4n

  • View
    2.562

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Donutsプロコンチャレンジ 2015 解説

Donuts プロコンチャレンジ2015

解説株式会社Donuts 久野慎弥(@kuno4n)

Page 2: Donutsプロコンチャレンジ 2015 解説

おつかれさまでした!

Page 3: Donutsプロコンチャレンジ 2015 解説

問題A ドーナツの体積

Page 4: Donutsプロコンチャレンジ 2015 解説

問題A

ドーナツの体積を求めましょう

Page 5: Donutsプロコンチャレンジ 2015 解説

問題A 解答

(R*R*π)*(D*2*π) を計算すればOK

πは、算術ライブラリの定数、acos(-1)、自分で書く、といった方法

Page 6: Donutsプロコンチャレンジ 2015 解説

問題A 解答

(R*R*π)*(D*2*π) を計算すればOK

πは、算術ライブラリの定数、acos(-1)、自分で書く、といった方法

Page 7: Donutsプロコンチャレンジ 2015 解説

問題B Tokyo 7th シスターズ

Page 8: Donutsプロコンチャレンジ 2015 解説

問題B

9≦n≦16 人のアイドルから9人選んで、ユニットの能力値を最大化させよう

Page 9: Donutsプロコンチャレンジ 2015 解説

問題B 解答

nが小さいので、各アイドルを使う・使わないを全列挙できます

2進数で管理すると楽

Page 10: Donutsプロコンチャレンジ 2015 解説

問題B 解答

nが小さいので、各アイドルを使う・使わないを全列挙できます

(定石)2進数で管理

Page 11: Donutsプロコンチャレンジ 2015 解説

問題B 解答

for(i = 0; i < 2^n; i++){

}

Page 12: Donutsプロコンチャレンジ 2015 解説

問題B 解答

for(i = 0; i < 2^n; i++){ if(iのビットが立っている数が9個){

} }

Page 13: Donutsプロコンチャレンジ 2015 解説

問題B 解答

for(i = 0; i < 2^n; i++){ if(iのビットが立っている数が9個){

// 結果が大きければ更新

} }

Page 14: Donutsプロコンチャレンジ 2015 解説

問題C 行列のできるドーナツ屋

Page 15: Donutsプロコンチャレンジ 2015 解説

問題C

一列に並ぶ1≦n≦100000 人の身長が与えられます

各人の「前を見た時に見える人の数」を求めて下さい

Page 16: Donutsプロコンチャレンジ 2015 解説

問題C 例

8 10 1 6 5 9 2

Page 17: Donutsプロコンチャレンジ 2015 解説

問題C 例

8 10 1 6 5 9 2

ここから見える人は、

Page 18: Donutsプロコンチャレンジ 2015 解説

問題C 例

8 10 1 6 5 9 2

ここから見える人は、3人

Page 19: Donutsプロコンチャレンジ 2015 解説

問題C 部分点解法(10点)

8 10 1 6 5 9 2

n ≦ 100

Page 20: Donutsプロコンチャレンジ 2015 解説

問題C 部分点解法(10点)

8 10 1 6 5 9 2

全ての人について、

Page 21: Donutsプロコンチャレンジ 2015 解説

問題C 部分点解法(10点)

8 10 1 6 5 9 2

全ての人について、別の全ての人に対し、

Page 22: Donutsプロコンチャレンジ 2015 解説

問題C 部分点解法(10点)

8 10 1 6 5 9 2

全ての人について、別の全ての人に対し、間に背の高い人がいないか調べる

Page 23: Donutsプロコンチャレンジ 2015 解説

問題C 部分点解法(10点)

8 10 1 6 5 9 2

O(n^3)

Page 24: Donutsプロコンチャレンジ 2015 解説

問題C 部分点解法(40点)

8 10 1 6 5 9 2

n ≦ 5000

Page 25: Donutsプロコンチャレンジ 2015 解説

問題C 部分点解法(40点)

8 10 1 6 5 9 2

調べたい人それぞれについて、

Page 26: Donutsプロコンチャレンジ 2015 解説

問題C 部分点解法(40点)

8 10 1 6 5 9 2

右から順に見ていき、「それまでの最大値」を保持する

Page 27: Donutsプロコンチャレンジ 2015 解説

問題C 部分点解法(40点)

8 10 1 6 5 9 2

それまでの最大値より大きければカウント+1

Page 28: Donutsプロコンチャレンジ 2015 解説

問題C 部分点解法(40点)

8 10 1 6 5 9 2

それまでの最大値より小さければなにもしない

Page 29: Donutsプロコンチャレンジ 2015 解説

問題C 部分点解法(40点)

8 10 1 6 5 9 2

O(n^2)

Page 30: Donutsプロコンチャレンジ 2015 解説

問題C 満点解法(100点)

8 10 1 6 5 9 2

n ≦ 100000

Page 31: Donutsプロコンチャレンジ 2015 解説

問題C 満点解法(100点)

8 10 1 6 5 9 2

n ≦ 100000

スタックを用いてO(n)で解く

Page 32: Donutsプロコンチャレンジ 2015 解説

問題C 満点解法(100点)

8 10 1 6 5 9 2

左から順に見て、

Page 33: Donutsプロコンチャレンジ 2015 解説

問題C 満点解法(100点)

8 10 1 6 5 9 2

左から順に見て、自分より背の低い情報はそれ以降捨てて良い

Page 34: Donutsプロコンチャレンジ 2015 解説

問題C 満点解法(100点)

8 10 1 6 5 9 2

8

Page 35: Donutsプロコンチャレンジ 2015 解説

問題C 満点解法(100点)

8 10 1 6 5 9 2

8 10

Page 36: Donutsプロコンチャレンジ 2015 解説

問題C 満点解法(100点)

8 10 1 6 5 9 2

10

Page 37: Donutsプロコンチャレンジ 2015 解説

問題C 満点解法(100点)

8 10 1 6 5 9 2

10 1

Page 38: Donutsプロコンチャレンジ 2015 解説

問題C 満点解法(100点)

8 10 1 6 5 9 2

10 1 6

Page 39: Donutsプロコンチャレンジ 2015 解説

問題C 満点解法(100点)

8 10 1 6 5 9 2

10 6

Page 40: Donutsプロコンチャレンジ 2015 解説

問題C 満点解法(100点)

8 10 1 6 5 9 2

10 6 5

Page 41: Donutsプロコンチャレンジ 2015 解説

問題C 満点解法(100点)

8 10 1 6 5 9 2

10 6 5 9

Page 42: Donutsプロコンチャレンジ 2015 解説

問題C 満点解法(100点)

8 10 1 6 5 9 2

10 9

Page 43: Donutsプロコンチャレンジ 2015 解説

問題C 満点解法(100点)

8 10 1 6 5 9 2

各要素に到達したときのスタックのサイズが答え10 9

Page 44: Donutsプロコンチャレンジ 2015 解説

問題C 満点解法(100点)

8 10 1 6 5 9 2

・「スタックに追加する」・「スタックから取り除く」いずれも高々n回 → O(n)

Page 45: Donutsプロコンチャレンジ 2015 解説

問題D ドーナツの箱詰め

Page 46: Donutsプロコンチャレンジ 2015 解説

問題D

1 ≦ n ≦ 200000 要素を、kグループに分ける

「各グループの(最大値 − 最小値)の和」の最小値は?

Page 47: Donutsプロコンチャレンジ 2015 解説

問題D 例

k = 3 {2, 12, 3, 13, 7, 17, 1}

Page 48: Donutsプロコンチャレンジ 2015 解説

問題D 例

k = 3 {2, 12, 3, 13, 7, 17, 1}

{1, 2, 3, 7} {12, 13} {17}

6+1+0 = 7 が最小値

Page 49: Donutsプロコンチャレンジ 2015 解説

問題D 例

k = 3 {2, 12, 3, 13, 7, 17, 1}

どんな入力であっても、

Page 50: Donutsプロコンチャレンジ 2015 解説

問題D 例

k = 3 {1, 2, 3, 7, 12, 13, 17}

どんな入力であっても、ソートしておき、

Page 51: Donutsプロコンチャレンジ 2015 解説

問題D 例

k = 3 {1, 2, 3, 7, 12, 13, 17}

どんな入力であっても、ソートしておき、

重ならない区間でグループ分けすることが最小値の必要条件

Page 52: Donutsプロコンチャレンジ 2015 解説

問題D 部分点解法(15点)

{1, 2, 3, 7, 12, 13, 17}

k = 2

Page 53: Donutsプロコンチャレンジ 2015 解説

問題D 部分点解法(15点)

{1, 2, 3, 7, 12, 13, 17}

k = 2

ソート後、グループ分けの候補をn-1通り試せば良い

Page 54: Donutsプロコンチャレンジ 2015 解説

問題D 部分点解法(40点)

{1, 2, 3, 7, 12, 13, 17}

1 ≦ k ≦ n

Page 55: Donutsプロコンチャレンジ 2015 解説

問題D 部分点解法(40点)

{1, 2, 3, 7, 12, 13, 17}

1 1 4 5 1 4

各要素の差からなる(n-1)要素を準備

Page 56: Donutsプロコンチャレンジ 2015 解説

問題D 部分点解法(40点)

{1, 2, 3, 7, 12, 13, 17}

1 1 4 5 1 4

各要素の差からなる(n-1)要素を準備グループ分けした時、差の要素のうち

(k-1)要素は含まれない

k = 3

Page 57: Donutsプロコンチャレンジ 2015 解説

問題D 部分点解法(40点)

{1, 2, 3, 7, 12, 13, 17}

1 1 4 5 1 4

小さい方から(n-1)-(k-1) = n-k個を選べば良い

k = 3

Page 58: Donutsプロコンチャレンジ 2015 解説

問題D 部分点解法(45点)

k = 2

{1, 2, 3, 7, 12, 13, 17}

1 1 4 5 1 4

Page 59: Donutsプロコンチャレンジ 2015 解説

問題D 部分点解法(45点)

k = 2

{1, 2, 3, 7, 12, 13, 17}

1 1 4 5 5

“差の要素”が減っていく

Page 60: Donutsプロコンチャレンジ 2015 解説

問題D 部分点解法(45点)

{1, 2, 3, 7, 12, 13, 17}

1 1 4 5 5

もとの要素はsetや隣接リストなどで持っておき、 要素がなくなった時に消える“差”と追加される“差”

を計算する。

Page 61: Donutsプロコンチャレンジ 2015 解説

問題D 部分点解法(45点)

{1, 2, 3, 7, 12, 13, 17}

1 1 4 5 5

“差”の要素はmultisetなどで持っておき、“差の合計”から“差の最大値”を引けば良い。

Page 62: Donutsプロコンチャレンジ 2015 解説

問題D 満点解法(100点)

1 ≦ k ≦ n

{1, 2, 3, 7, 12, 13, 17}

1 1 4 5 5

“差の要素”が減っていく

Page 63: Donutsプロコンチャレンジ 2015 解説

問題D 満点解法(100点)

{1, 2, 3, 7, 12, 13, 17}

1 1 4 5 5

・“差の要素”に数Xを追加する/取り除く・“差の要素”の小さいn-k個の和を求めるという操作を高速に行う

Page 64: Donutsプロコンチャレンジ 2015 解説

問題D 満点解法(100点)

{1, 2, 3, 7, 12, 13, 17}

1 1 4 5 5

・“差の要素”に数Xを追加する/取り除く・“差の要素”の小さいn-k個の和を求めるという操作を高速に行う

Segment Tree

Page 65: Donutsプロコンチャレンジ 2015 解説

0 1 2 3 4 5 6 7

各ノードは、“差の要素”の「個数」と「和」の情報をもつ。

Page 66: Donutsプロコンチャレンジ 2015 解説

0 1 2 3 4 5 6 7

“差の要素”の中に、4~7は、現在いくつ持っていて、その合計はいくつか?

Page 67: Donutsプロコンチャレンジ 2015 解説

0 1 2 3 4 5 6 7

2・3は、現在いくつ持っていて、その合計はいくつか?

Page 68: Donutsプロコンチャレンジ 2015 解説

1000 1001 1010 1011 1100 1101 1110 1111

100 101 110 111

10 11

1

0 1 2 3 4 5 6 7

ノード番号(2進)

Page 69: Donutsプロコンチャレンジ 2015 解説

1000 1001 1010 1011 1100 1101 1110 1111

100 101 110 111

10 11

1

0 1 2 3 4 5 6 7

左の子を見るときは、2倍する

Page 70: Donutsプロコンチャレンジ 2015 解説

1000 1001 1010 1011 1100 1101 1110 1111

100 101 110 111

10 11

1

0 1 2 3 4 5 6 7

右の子を見るときは、2倍して1足す

Page 71: Donutsプロコンチャレンジ 2015 解説

1000 1001 1010 1011 1100 1101 1110 1111

100 101 110 111

10 11

1

0 1 2 3 4 5 6 7

親を見るときは、2で割る

Page 72: Donutsプロコンチャレンジ 2015 解説

0 1 2 3 4 5 6 7

“差の要素”に5を追加/削除するときの更新対象

Page 73: Donutsプロコンチャレンジ 2015 解説

0 1 2 3 4 5 6 7

「小さい方からX個の合計」を求める

Page 74: Donutsプロコンチャレンジ 2015 解説

0 1 2 3 4 5 6 7

左の子(0~3)がX個以上持っていれば、

Page 75: Donutsプロコンチャレンジ 2015 解説

0 1 2 3 4 5 6 7

左の子(0~3)がX個以上持っていれば、再帰的に左の子より下を引き続き見る

Page 76: Donutsプロコンチャレンジ 2015 解説

0 1 2 3 4 5 6 7

左の子(0~3)がX個未満(Y個)であれば、

Page 77: Donutsプロコンチャレンジ 2015 解説

0 1 2 3 4 5 6 7

左の子(0~3)がX個未満(Y個)であれば、左の子(0~3)の合計値は必ず使用し、

Page 78: Donutsプロコンチャレンジ 2015 解説

0 1 2 3 4 5 6 7

左の子(0~3)がX個未満(Y個)であれば、左の子(0~3)の合計値は必ず使用し、右の子(4~7)の小さい方からX-Y個を取得

Page 79: Donutsプロコンチャレンジ 2015 解説

問題D 満点解法(別解)

“差の要素”の小さい方からn-k-i個の和が必要になるので、

n-k-i個以下のmultisetと、n-k-i個超のmultisetの2つを用意する

“差の要素”の追加・削除に応じて、2つのmultiset間でやりとりする。

Page 80: Donutsプロコンチャレンジ 2015 解説

問題D 満点解法(別解)

“差の要素”の小さい方からn-k-i個の和が必要になるので、

n-k-i個以下のmultisetと、n-k-i個超のmultisetの2つを用意する

“差の要素”の追加・削除に応じて、2つのmultiset間でやりとりする。

Page 81: Donutsプロコンチャレンジ 2015 解説

ありがとうございました!