• Like
AtCoder Regular Contest 031 解説
Upcoming SlideShare
Loading in...5
×
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
0
On Slideshare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
0
Comments
0
Likes
1

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

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