atcoder regular contest 046
TRANSCRIPT
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
考察•この問題は二部グラフの最大マッチング問題
–最大流を求めるアルゴリズムで解くことができるが…• 今回は頂点数,辺の数ともに大きく間に合わない• 問題で与えられた制約や性質をうまく利用することを考える
123
1234サンプル 2
部分点 (30 点)•任意の i, j ( 1 ≦ i≦ N, 1 ≦ j≦M)で Bi≦ Cjが成立
–任意の男性の要求を全ての女性が満たす
•各女性について要求を満たす男性がいるか知りたい– Ai, Djにのみ着目すればよい– Ai, Djで男女それぞれをソートする
部分点 (30 点)•サンプル 2 についてAi, Djで昇順にソートすると…• Djが小さい女性から順に、まだペアを組んでいないDj≦ Aiを満たす Aiが最小の男性とのペアを貪欲に成立させていくのが最適だと分かる
213
2143サンプル 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 へ戻ってくるまでの周期は
LCMW
GCD 𝑊, 𝑥,
H
GCD 𝐻, 𝑦
解法
• 𝑑 = GCD(𝐻,𝑊)を計算する。
• 𝑥 ≥ 0,𝑦 ≥ 0,𝑥 + 𝑦 = 𝑑 を満たす 𝑥, 𝑦 の組を全探索する。
•各 𝑥, 𝑦 の組に対して、
LCMW
GCD 𝑊, 𝑥,
H
GCD 𝐻, 𝑦=𝐻𝑊
𝑑ならば、 𝑥+𝑦
𝑥を答えに足す。
•計算量は O 𝑑 log 𝑑