Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
ARC #031解説 
解説スライド:水野尚人(not)
問題A 名前
問題概要 
文字列が回文かどうか判定する 
文字列の長さ≦100文字 
類題:ARC #019 B -こだわりの名前
解法1 
前と後ろで対応する文字が同じか調べる 
a w a w a
解法2 
ひっくり返した文字列と同じになるか調べる 
chokudai→ iadukohc 
chokudai≠ iadukohc
問題B 埋め立て
問題概要 
10×10のグリッドが与えられる 
各マスは陸地または海 
1マスだけ海を陸地にすることで、 
陸地を全部繋げられるか?
入力例1 
赤枠のマスを埋め立てると 
1つの島になる
解法 
どこを埋め立てるかを全探索して、 
1つの島になっているか調べる 
1つの島になっているかは、あるマスから 
すべてのマスにたどり着けるかを幅優先探索や 
深さ優先探索で調べれば良い
問題C 積み木
問題概要 
N個の積み木が1列に並べられている 
隣り合う2個の積み木を並べ替えて、一番高い 積み木から順に左右へ低くなるよう並び替える 
最小の交換回数は? 
N≦100,000(部分点:N≦100)
入力例2
まず1番小さい積み木だけ移動させてみる 
左右どちらかの端に移動させないといけない 
残った部分は同じ形をしている 
近い方に移動させれば良い 
解法
2番目、3番目、…と同じ操作をしていくと 
最小の交換回数が求められる 
愚直にやると푂푁2→ 30点 
解法
各積み木を移動させる回数 
=それより大きい積み木が左側と右側に何個ずつ 
あるか調べて、その小さい方 
Binary Indexed Treeなどを用いると푂(푙표푔푁)で 
計算できる 
解法
解法 
2 
4 
1 
3 
5 
2回 
2回 
1はどちらに動かしても2回交換が必要
解法 
2 
4 
1 
3 
5 
3回 
0回 
2はすでに左側にあるので動かさなくて良い
解法 
2 
4 
1 
3 
5 
1回 
1回 
3はどちらに動かしても交換回数は1回
解法 
2 
4 
1 
3 
5 
1回 
0回 
4はそのままで良い
解法 
・最初に全要素1としてBinary Indexed Treeを 
構築し、小さい方から順に見ていく 
・左側と右側の和を計算する 
・各積み木を調べたら、Binary Indexed Treeの 
対応する要素を0に変更する 
・計算量...
問題D 買い物上手
問題概要 
アイテムの組み合わせると経験値が得られる 
「得られた経験値÷使ったお金」を最大化 
経験値をもらえる組み合わせの数≦100 
アイテムの種類数≦100
入力例1 
アイテム1・2・3を買うと、経験値7、使ったお金7 
となり答えは1
解法 
「平均」を最大化/最小化 
→答えについて二分法 
類題)ARC #026 D -道を直すお仕事 
得られた経験値÷使ったお金=푥と思って 
得られた経験値-使ったお金×푥の正負で 
二分法をする
解法 
経験値をもらうかどうかをexp(푖)とし、 
アイテムを買うかどうかをitem(푖)とすると 
푆푖exp(푖)−푥 푇푖푖푡푒푚(푖) 
を最大化すれば良い。ただし、 
exp푖=0,1、푖푡푒푚푖=0,1 
と、푖番目の経験値に푗番...
解法 
푆푖>0、푇푖>0なので条件は以下のように 
書き直すことができる 
exp푖≦1 
푖푡푒푚푖≧0 
푒푥푝푖≦푖푡푒푚푗 
これは線形計画法になっているのでsimplex法 
などで解くことができる 
ただし、このままではTLEを回...
解法 
双対問題を考えると以下のように書き換えられる 
条件: 
푗 푥푖푗≦푆푖 푖 푥푖푗≦푥푇푖 
푥푖푗≧0(経験値푖にアイテム푗が必要な場合) 
最大化: 
푖,푗 푥푖푗− 푖 푆푖 
これは二部グラフの最大流になっている
解法 
入力例1 
source 
経験値2 
経験値3 
経験値1 
アイテム1 
アイテム2 
アイテム3 
アイテム4 
sink 
3
解法 
このグラフで、sourceから出ている辺を 
流し切れるなら푥が小さい 
流しきれないなら푥が大きい 
グラフをよく眺めると値段あたりの経験値を 
푥として求める形になっている 
参考文献: 
二部グラフにおける最大重み閉包問題(古林他)
Upcoming SlideShare
Loading in …5
×

of

AtCoder Regular Contest 031 解説 Slide 1 AtCoder Regular Contest 031 解説 Slide 2 AtCoder Regular Contest 031 解説 Slide 3 AtCoder Regular Contest 031 解説 Slide 4 AtCoder Regular Contest 031 解説 Slide 5 AtCoder Regular Contest 031 解説 Slide 6 AtCoder Regular Contest 031 解説 Slide 7 AtCoder Regular Contest 031 解説 Slide 8 AtCoder Regular Contest 031 解説 Slide 9 AtCoder Regular Contest 031 解説 Slide 10 AtCoder Regular Contest 031 解説 Slide 11 AtCoder Regular Contest 031 解説 Slide 12 AtCoder Regular Contest 031 解説 Slide 13 AtCoder Regular Contest 031 解説 Slide 14 AtCoder Regular Contest 031 解説 Slide 15 AtCoder Regular Contest 031 解説 Slide 16 AtCoder Regular Contest 031 解説 Slide 17 AtCoder Regular Contest 031 解説 Slide 18 AtCoder Regular Contest 031 解説 Slide 19 AtCoder Regular Contest 031 解説 Slide 20 AtCoder Regular Contest 031 解説 Slide 21 AtCoder Regular Contest 031 解説 Slide 22 AtCoder Regular Contest 031 解説 Slide 23 AtCoder Regular Contest 031 解説 Slide 24 AtCoder Regular Contest 031 解説 Slide 25 AtCoder Regular Contest 031 解説 Slide 26 AtCoder Regular Contest 031 解説 Slide 27 AtCoder Regular Contest 031 解説 Slide 28 AtCoder Regular Contest 031 解説 Slide 29
Upcoming SlideShare
AtCoder Regular Contest 028 解説
Next
Download to read offline and view in fullscreen.

1 Like

Share

Download to read offline

AtCoder Regular Contest 031 解説

Download to read offline

AtCoder Regular Contest 031 解説

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all

AtCoder Regular Contest 031 解説

  1. 1. ARC #031解説 解説スライド:水野尚人(not)
  2. 2. 問題A 名前
  3. 3. 問題概要 文字列が回文かどうか判定する 文字列の長さ≦100文字 類題:ARC #019 B -こだわりの名前
  4. 4. 解法1 前と後ろで対応する文字が同じか調べる a w a w a
  5. 5. 解法2 ひっくり返した文字列と同じになるか調べる chokudai→ iadukohc chokudai≠ iadukohc
  6. 6. 問題B 埋め立て
  7. 7. 問題概要 10×10のグリッドが与えられる 各マスは陸地または海 1マスだけ海を陸地にすることで、 陸地を全部繋げられるか?
  8. 8. 入力例1 赤枠のマスを埋め立てると 1つの島になる
  9. 9. 解法 どこを埋め立てるかを全探索して、 1つの島になっているか調べる 1つの島になっているかは、あるマスから すべてのマスにたどり着けるかを幅優先探索や 深さ優先探索で調べれば良い
  10. 10. 問題C 積み木
  11. 11. 問題概要 N個の積み木が1列に並べられている 隣り合う2個の積み木を並べ替えて、一番高い 積み木から順に左右へ低くなるよう並び替える 最小の交換回数は? N≦100,000(部分点:N≦100)
  12. 12. 入力例2
  13. 13. まず1番小さい積み木だけ移動させてみる 左右どちらかの端に移動させないといけない 残った部分は同じ形をしている 近い方に移動させれば良い 解法
  14. 14. 2番目、3番目、…と同じ操作をしていくと 最小の交換回数が求められる 愚直にやると푂푁2→ 30点 解法
  15. 15. 各積み木を移動させる回数 =それより大きい積み木が左側と右側に何個ずつ あるか調べて、その小さい方 Binary Indexed Treeなどを用いると푂(푙표푔푁)で 計算できる 解法
  16. 16. 解法 2 4 1 3 5 2回 2回 1はどちらに動かしても2回交換が必要
  17. 17. 解法 2 4 1 3 5 3回 0回 2はすでに左側にあるので動かさなくて良い
  18. 18. 解法 2 4 1 3 5 1回 1回 3はどちらに動かしても交換回数は1回
  19. 19. 解法 2 4 1 3 5 1回 0回 4はそのままで良い
  20. 20. 解法 ・最初に全要素1としてBinary Indexed Treeを 構築し、小さい方から順に見ていく ・左側と右側の和を計算する ・各積み木を調べたら、Binary Indexed Treeの 対応する要素を0に変更する ・計算量は全体で푂(푁푙표푔푁)
  21. 21. 問題D 買い物上手
  22. 22. 問題概要 アイテムの組み合わせると経験値が得られる 「得られた経験値÷使ったお金」を最大化 経験値をもらえる組み合わせの数≦100 アイテムの種類数≦100
  23. 23. 入力例1 アイテム1・2・3を買うと、経験値7、使ったお金7 となり答えは1
  24. 24. 解法 「平均」を最大化/最小化 →答えについて二分法 類題)ARC #026 D -道を直すお仕事 得られた経験値÷使ったお金=푥と思って 得られた経験値-使ったお金×푥の正負で 二分法をする
  25. 25. 解法 経験値をもらうかどうかをexp(푖)とし、 アイテムを買うかどうかをitem(푖)とすると 푆푖exp(푖)−푥 푇푖푖푡푒푚(푖) を最大化すれば良い。ただし、 exp푖=0,1、푖푡푒푚푖=0,1 と、푖番目の経験値に푗番目のアイテムが必要なら 푒푥푝푖=1→푖푡푒푚푗=1 が成り立たなければならない。
  26. 26. 解法 푆푖>0、푇푖>0なので条件は以下のように 書き直すことができる exp푖≦1 푖푡푒푚푖≧0 푒푥푝푖≦푖푡푒푚푗 これは線形計画法になっているのでsimplex法 などで解くことができる ただし、このままではTLEを回避するのが困難
  27. 27. 解法 双対問題を考えると以下のように書き換えられる 条件: 푗 푥푖푗≦푆푖 푖 푥푖푗≦푥푇푖 푥푖푗≧0(経験値푖にアイテム푗が必要な場合) 最大化: 푖,푗 푥푖푗− 푖 푆푖 これは二部グラフの最大流になっている
  28. 28. 解法 入力例1 source 経験値2 経験値3 経験値1 アイテム1 アイテム2 アイテム3 アイテム4 sink 3
  29. 29. 解法 このグラフで、sourceから出ている辺を 流し切れるなら푥が小さい 流しきれないなら푥が大きい グラフをよく眺めると値段あたりの経験値を 푥として求める形になっている 参考文献: 二部グラフにおける最大重み閉包問題(古林他)
  • what_alnk

    Dec. 13, 2014

AtCoder Regular Contest 031 解説

Views

Total views

10,134

On Slideshare

0

From embeds

0

Number of embeds

306

Actions

Downloads

30

Shares

0

Comments

0

Likes

1

×