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.

AtCoder Regular Contest 046

4,050 views

Published on

AtCoder Regular Contest 046 解説

Published in: Education
  • Be the first to comment

AtCoder Regular Contest 046

  1. 1. AtCoder Regular Contest 046 解説 AtCoder株式会社 3/19/15
  2. 2. 問題 A – ゾロ目数
  3. 3. 問題概要 • すべての桁の数字が同じであるような正の整数をゾロ目数と呼ぶ。 • 小さい方から 𝑁 番目のゾロ目数を求めよ。 • 1 ≤ 𝑁 ≤ 50
  4. 4. 解法 (1) • ゾロ目数を列挙してみる。 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 22, 33, 44, 55, 66, 77, 88, 99, 111, 222, 333, 444, 555, 666, 777, 888, 999, … • 𝑖 行目の 𝑗 番目のゾロ目数は、数字 𝑗 を 𝑖 回繰り返した数である。 • 数字 (N-1)%9+1 を (N-1)/9+1 回出力すればよい。
  5. 5. 解法 (2) • サンプル 3 を見ると、𝑁 = 50 のゾロ目数は 555555 と小さい。 • 1 から 555555 まで順にゾロ目数か判定しても、間に合う。
  6. 6. 解法 (3) • 𝑁 ≤ 50 と小さい。 • 小さい方から 50 番目までのゾロ目数を、コードに埋め込む。
  7. 7. B: 石取り大作戦
  8. 8. 問題概要 • N 個の石を使って石取りゲームを行う – プレイヤーは交互に 1 個以上の石を取る – 最後の石を取ったほうの勝利である • 先手は A 個、後手は B 個まで一度に石を取れる • 2 人が最適に行動したとき勝利するのはどちらか? • 制約 – 1 ≦ N ≦ 109 – 1 ≦ A, B ≦ 109
  9. 9. 考察 • N ≦ A のとき – 先手が全ての石を取れば勝利 – 先手必勝 • N > A のとき – A = B のとき • ? – A ≠ B のとき • ?
  10. 10. (1) N > A かつ A = B のとき • N = A + 1 のときを考える (サンプル 2 参照) – 先手がどのように石を取っても必ず後手が勝つ – 後手必勝 • N を A + 1 で割ったあまりが 0 のとき、後手必勝 – 先手がどのように石を取っても、後手は石の数を A + 1 で 割ったあまりが 0 となるように石を取り続けることが可能 – 後手はいずれ最後の石を取り勝利する • N を A + 1 で割ったあまりが 0 以外のときは?
  11. 11. (1) N > A かつ A = B のとき • N を A + 1で割ったあまりが 0 以外のときは? – 石の数を A + 1 で割ったあまりが 0 になるように取ると、 後手必勝の状況を相手に押しつけられる – よって先手必勝
  12. 12. (2) N > A かつ A ≠ B のとき • A > B のときを考える – 直感的には先手が有利そう – この直感は正しく先手必勝 • 証明 – N > A のときを考える – 先手が 1 個の石を取ったとき、後手がどのように石を 取ったとしても再び先手の手番が訪れる • N – 1 > A – 1 ≧ B より明らか – いずれ N ≦ A の盤面で先手の手番が訪れるので先手必勝
  13. 13. (2) N > A かつ A ≠ B のとき • A < B のときを考える – こちらの場合には後手必勝 • 証明 – 先手がどのように石を取っても後手の手番が訪れる – このとき残りの石の数 N について N ≦ B ならば後手の勝利 – N > B のとき、後手が 1 個の石を取ったとき、先手が どのように石を取ったとしても再び後手の手番が訪れる – いずれ N ≦ B の盤面で後手の手番が訪れるので後手必勝
  14. 14. まとめ • N ≦ A のとき – 先手必勝 • N > A のとき – A = B のとき • N を A + 1 で割ったあまりが 0 以外: 先手必勝 • それ以外: 後手必勝 – A ≠ B のとき • A > B : 先手必勝 • A < B : 後手必勝 いずれの場合も O(1) で判定可能
  15. 15. C: 合コン大作戦
  16. 16. 問題概要 • N 人の男性と M 人の女性がいる • i 番目の男性は整数 Ai , Bi を持つ • j 番目の女性は整数 Cj , Dj を持つ • Dj ≦ Ai かつ Bi ≦ Cj となるペアの数を最大化せよ – ただし,それぞれの人は複数のペアに所属してはならない • 制約 – 1 ≦ N, M ≦ 150,000 – 1 ≦ Ai , Bi , Cj , Dj ≦ 109
  17. 17. 考察 • この問題は二部グラフの最大マッチング問題 – 最大流を求めるアルゴリズムで解くことができるが… • 今回は頂点数,辺の数ともに大きく間に合わない • 問題で与えられた制約や性質をうまく利用することを考える 1 2 3 1 2 3 4サンプル 2
  18. 18. 部分点 (30 点) • 任意の i, j ( 1 ≦ i ≦ N, 1 ≦ j ≦ M) で Bi ≦ Cj が成立 – 任意の男性の要求を全ての女性が満たす • 各女性について要求を満たす男性がいるか知りたい – Ai, Dj にのみ着目すればよい – Ai, Dj で男女それぞれをソートする
  19. 19. 部分点 (30 点) • サンプル 2 についてAi, Djで昇順にソートすると… • Dj が小さい女性から順に、まだペアを組んでいない Dj ≦ Ai を満たす Ai が最小の男性とのペアを貪欲に 成立させていくのが最適だと分かる 2 1 3 2 1 4 3サンプル 2
  20. 20. 部分点解法 (30 点) • Dj が小さい女性から順に、先述の条件を満たす男性 と貪欲にマッチングを行えばよい • 愚直に毎回調べると O(NM) となって間に合わないが しゃくとり法を用いるとO(N + M) で実現できる • 計算量はソート部分が最も重く O(N logN + M logM)
  21. 21. 満点 (100 点) • 今度は Bi > Cj であるようなケースが存在する – Ai , Dj に関する単純な貪欲法ではうまくいかない • 突然だが、部分点解法を以下のように言い換える – 集合 S がある。 S ははじめ空集合である – 以下の N + M 個の 2 種類のクエリに答えよ • S に要素を 1 つ追加する • S から要素を 1 つ取り除く。 S が空集合ならば何もしない – 要素の追加はマッチングを待っている女性の追加を、 要素の削除は男性とのマッチングを成立させるのに対応 – S から要素を取り除くのに成功した回数が求める答え
  22. 22. 満点 (100 点) • 満点の状況に対応するようさらに言い換える – 多重集合 S がある。 S ははじめ空集合である – 以下の N + M 個の 2 種類のクエリに答えよ • S に Cj を 1 つ追加する • S から Bi 以上の要素を 1 つ取り除く。 S に条件を満たすものが 存在しないならば、何もしない – 要素の追加はマッチングを待っている女性の追加を、 要素の削除は男性とのマッチングを成立させるのに対応 – S から要素を取り除くのに成功した回数が求める答え – 削除する要素はどのように選ぶのが最適か? • 条件を満たすような最小の要素を選ぶのが最適
  23. 23. 満点解法 (100 点) • この問題は最終的に以下の問題に帰着できる – 多重集合 S がある。 S ははじめ空集合である – 以下の N + M 個の 2 種類のクエリに答えよ • S に Cj を 1 つ追加する • S から Bi 以上の最小の要素を 1 つ取り除く。 S に条件を 満たすものが存在しないならば、何もしない – S から要素を取り除くのに成功した回数が求める答え • 上記のクエリをmultisetを用いて処理してやればよい – multisetが標準ライブラリに存在しない場合でも、 セグメント木、Fenwick Tree、平方分割などのデータ構造を 用いて解くことが可能 • 全体の計算量は O((N + M)log(N + M))
  24. 24. 問題 D – うさぎとマス目
  25. 25. 問題概要 • 𝐻 行、𝑊 列のマス目がある。 • 最初、 0, 0 にうさぎがいる。 • うさぎは 𝑖, 𝑗 から ( 𝑖 + 1 %𝐻, 𝑗) または (𝑖, 𝑗 + 1 %𝑊) へ移動できる。 • うさぎがすべてのマスをちょうど 1 回ずつ訪れ、 0, 0 へ戻ってくる方法 は何通りか?
  26. 26. 例(サンプル 1) • 𝐻 = 2,𝑊 = 2 → 2 通り
  27. 27. 例(サンプル 2) • 𝐻 = 6,𝑊 = 3 → 3 通り
  28. 28. 考察 (1) • 仮に、マス ① から → へ移動するとする。
  29. 29. 考察 (1) • マス ② を訪れるためには、マス ③ から → へ移動しなければならない。
  30. 30. 考察 (1) • 連鎖的に、→ へ移動しなければならないマスが決まっていく。
  31. 31. 考察 (1) • 仮に、マス ① から ↓ へ移動するとする。
  32. 32. 考察 (1) • マス ② を訪れるためには、マス ③ から ↓ へ移動しなければならない。
  33. 33. 考察 (1) • 連鎖的に、↓ へ移動しなければならないマスが決まっていく。
  34. 34. 考察 (1) • 結局、青のレーンはすべて同じ向きへ移動しなければならない。
  35. 35. 考察 (1) • 同様に、赤や緑のレーンはすべて同じ向きへ移動しなければならない。 • ここで、レーンの本数 𝑑 は 𝑑 = GCD 𝐻, 𝑊 と計算できる。
  36. 36. 考察 (1) • 最初の 𝑑 歩の向きを決めると、
  37. 37. 考察 (1) • 最初の 𝑑 歩の向きを決めると、全体の向きが一意に決まる。 • しかも、最初の 𝑑 歩の繰り返しになっている!
  38. 38. 考察 (1) • 「すべてのマスをちょうど 1 回ずつ訪れ、 0, 0 へ戻ってくる」ためには、 「最初の 𝑑 歩を繰り返す」ことが必要条件。
  39. 39. 考察 (2) • しかし、「最初の 𝑑 歩を繰り返す」ことは必要十分条件ではない。 • 先の例は、すべてのマスを訪れる前に 0, 0 へ戻ってしまっている。
  40. 40. 考察 (2) • 最初の 𝑑 歩を全通り試し、すべてのマスを訪れているか個別に チェックする? → 最初の 𝑑 歩は 2 𝑑 通りもあるので、TLE してしまう。
  41. 41. 考察 (2) • 「最初の 𝑑 歩の行き先」は 𝑑 + 1 通りしかないので、全通り試せる。 • 最初の 𝑑 歩をまとめて、紫の矢印で表す。
  42. 42. 考察 (2) • 紫の矢印は 𝑑 歩分なので、紫の矢印を 𝐻𝑊 𝑑 回繰り返して 0, 0 へ 戻ってくれば、すべてのマスを訪れたことになる。
  43. 43. 考察 (2) • OK の例
  44. 44. 考察 (2) • NG の例
  45. 45. 考察 (2) • 紫の矢印を何回繰り返すと 0, 0 へ戻ってくるか? • 紫の矢印が右へ 𝑥 マス、下へ 𝑦 マス移動するとする。 (ただし、𝑥 + 𝑦 = 𝑑) • 紫の矢印の横方向の周期は W GCD 𝑊,𝑥 • 紫の矢印の縦方向の周期は H GCD 𝐻,𝑦 • よって、紫の矢印が 0, 0 へ戻ってくるまでの周期は LCM W GCD 𝑊, 𝑥 , H GCD 𝐻, 𝑦
  46. 46. 解法 • 𝑑 = GCD(𝐻, 𝑊) を計算する。 • 𝑥 ≥ 0,𝑦 ≥ 0,𝑥 + 𝑦 = 𝑑 を満たす 𝑥, 𝑦 の組を全探索する。 • 各 𝑥, 𝑦 の組に対して、 LCM W GCD 𝑊, 𝑥 , H GCD 𝐻, 𝑦 = 𝐻𝑊 𝑑 ならば、 𝑥+𝑦 𝑥 を答えに足す。 • 計算量は O 𝑑 log 𝑑

×