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

AtCoder Regular Contest 046

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