AtCoder Regular Contest 046

46
AtCoder Regular Contest 046 解説 AtCoder株式会社 3/19/15

Transcript of AtCoder Regular Contest 046

Page 1: AtCoder Regular Contest 046

AtCoder Regular Contest 046

解説

AtCoder株式会社

3/19/15

Page 2: AtCoder Regular Contest 046

問題 A –ゾロ目数

Page 3: AtCoder Regular Contest 046

問題概要

• すべての桁の数字が同じであるような正の整数をゾロ目数と呼ぶ。

•小さい方から 𝑁番目のゾロ目数を求めよ。

• 1 ≤ 𝑁 ≤ 50

Page 4: AtCoder Regular Contest 046

解法 (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回出力すればよい。

Page 5: AtCoder Regular Contest 046

解法 (2)

•サンプル 3 を見ると、𝑁 = 50のゾロ目数は 555555 と小さい。

• 1から 555555まで順にゾロ目数か判定しても、間に合う。

Page 6: AtCoder Regular Contest 046

解法 (3)

• 𝑁 ≤ 50 と小さい。

•小さい方から 50番目までのゾロ目数を、コードに埋め込む。

Page 7: AtCoder Regular Contest 046

B: 石取り大作戦

Page 8: AtCoder Regular Contest 046

問題概要• N個の石を使って石取りゲームを行う

–プレイヤーは交互に 1 個以上の石を取る–最後の石を取ったほうの勝利である

•先手は A個、後手は B個まで一度に石を取れる• 2 人が最適に行動したとき勝利するのはどちらか?

•制約– 1 ≦ N≦ 109

– 1 ≦ A, B≦ 109

Page 9: AtCoder Regular Contest 046

考察• N≦ Aのとき

–先手が全ての石を取れば勝利–先手必勝

• N > Aのとき– A = Bのとき

• ?– A ≠ Bのとき

• ?

Page 10: AtCoder Regular Contest 046

(1) N > Aかつ A = Bのとき• N = A + 1 のときを考える (サンプル 2 参照)

–先手がどのように石を取っても必ず後手が勝つ–後手必勝

• Nを A + 1 で割ったあまりが 0 のとき、後手必勝–先手がどのように石を取っても、後手は石の数を A + 1 で割ったあまりが 0 となるように石を取り続けることが可能–後手はいずれ最後の石を取り勝利する

• Nを A + 1 で割ったあまりが 0 以外のときは?

Page 11: AtCoder Regular Contest 046

(1) N > Aかつ A = Bのとき• Nを A + 1で割ったあまりが 0 以外のときは?

–石の数を A + 1 で割ったあまりが 0 になるように取ると、後手必勝の状況を相手に押しつけられる–よって先手必勝

Page 12: AtCoder Regular Contest 046

(2) N > Aかつ A ≠ Bのとき• A > B のときを考える

–直感的には先手が有利そう–この直感は正しく先手必勝

•証明– N > A のときを考える–先手が 1 個の石を取ったとき、後手がどのように石を取ったとしても再び先手の手番が訪れる

• N – 1 > A – 1 ≧ Bより明らか–いずれ N≦ A の盤面で先手の手番が訪れるので先手必勝

Page 13: AtCoder Regular Contest 046

(2) N > Aかつ A ≠ B のとき• A < Bのときを考える

–こちらの場合には後手必勝

•証明–先手がどのように石を取っても後手の手番が訪れる–このとき残りの石の数 N について N≦ B ならば後手の勝利– N > B のとき、後手が 1 個の石を取ったとき、先手がどのように石を取ったとしても再び後手の手番が訪れる–いずれ N≦ Bの盤面で後手の手番が訪れるので後手必勝

Page 14: AtCoder Regular Contest 046

まとめ• N≦ A のとき

–先手必勝• N > Aのとき

– A = Bのとき• Nを A + 1 で割ったあまりが 0 以外: 先手必勝• それ以外: 後手必勝

– A ≠ B のとき• A > B : 先手必勝• A < B : 後手必勝

いずれの場合も O(1)で判定可能

Page 15: AtCoder Regular Contest 046

C: 合コン大作戦

Page 16: AtCoder Regular Contest 046

問題概要• N人の男性と M人の女性がいる• i番目の男性は整数 Ai , Biを持つ• j番目の女性は整数 Cj , Djを持つ

• Dj≦ Aiかつ Bi≦ Cjとなるペアの数を最大化せよ–ただし,それぞれの人は複数のペアに所属してはならない

•制約– 1 ≦ N, M≦ 150,000– 1 ≦ Ai , Bi , Cj , Dj≦ 109

Page 17: AtCoder Regular Contest 046

考察•この問題は二部グラフの最大マッチング問題

–最大流を求めるアルゴリズムで解くことができるが…• 今回は頂点数,辺の数ともに大きく間に合わない• 問題で与えられた制約や性質をうまく利用することを考える

123

1234サンプル 2

Page 18: AtCoder Regular Contest 046

部分点 (30 点)•任意の i, j ( 1 ≦ i≦ N, 1 ≦ j≦M)で Bi≦ Cjが成立

–任意の男性の要求を全ての女性が満たす

•各女性について要求を満たす男性がいるか知りたい– Ai, Djにのみ着目すればよい– Ai, Djで男女それぞれをソートする

Page 19: AtCoder Regular Contest 046

部分点 (30 点)•サンプル 2 についてAi, Djで昇順にソートすると…• Djが小さい女性から順に、まだペアを組んでいないDj≦ Aiを満たす Aiが最小の男性とのペアを貪欲に成立させていくのが最適だと分かる

213

2143サンプル 2

Page 20: AtCoder Regular Contest 046

部分点解法 (30 点)• Djが小さい女性から順に、先述の条件を満たす男性と貪欲にマッチングを行えばよい

•愚直に毎回調べると O(NM) となって間に合わないがしゃくとり法を用いるとO(N + M) で実現できる

•計算量はソート部分が最も重く O(N logN + M logM)

Page 21: AtCoder Regular Contest 046

満点 (100 点)•今度は Bi > Cjであるようなケースが存在する

– Ai , Djに関する単純な貪欲法ではうまくいかない•突然だが、部分点解法を以下のように言い換える

–集合 Sがある。 Sははじめ空集合である–以下の N + M個の 2 種類のクエリに答えよ

• Sに要素を 1 つ追加する• Sから要素を 1 つ取り除く。 Sが空集合ならば何もしない

–要素の追加はマッチングを待っている女性の追加を、要素の削除は男性とのマッチングを成立させるのに対応– Sから要素を取り除くのに成功した回数が求める答え

Page 22: AtCoder Regular Contest 046

満点 (100 点)•満点の状況に対応するようさらに言い換える

–多重集合 Sがある。 Sははじめ空集合である–以下の N + M個の 2 種類のクエリに答えよ

• Sに Cjを 1 つ追加する• Sから Bi以上の要素を 1 つ取り除く。 Sに条件を満たすものが存在しないならば、何もしない

–要素の追加はマッチングを待っている女性の追加を、要素の削除は男性とのマッチングを成立させるのに対応– Sから要素を取り除くのに成功した回数が求める答え–削除する要素はどのように選ぶのが最適か?

• 条件を満たすような最小の要素を選ぶのが最適

Page 23: AtCoder Regular Contest 046

満点解法 (100 点)•この問題は最終的に以下の問題に帰着できる

–多重集合 Sがある。 Sははじめ空集合である–以下の N + M個の 2 種類のクエリに答えよ

• Sに Cjを 1 つ追加する• Sから Bi以上の最小の要素を 1 つ取り除く。 Sに条件を満たすものが存在しないならば、何もしない

– Sから要素を取り除くのに成功した回数が求める答え•上記のクエリをmultisetを用いて処理してやればよい

– multisetが標準ライブラリに存在しない場合でも、セグメント木、Fenwick Tree、平方分割などのデータ構造を用いて解くことが可能•全体の計算量は O((N + M)log(N + M))

Page 24: AtCoder Regular Contest 046

問題 D – うさぎとマス目

Page 25: AtCoder Regular Contest 046

問題概要

• 𝐻行、𝑊列のマス目がある。

•最初、 0, 0 にうさぎがいる。

• うさぎは 𝑖, 𝑗 から ( 𝑖 + 1 %𝐻, 𝑗)または (𝑖, 𝑗 + 1 %𝑊)へ移動できる。

• うさぎがすべてのマスをちょうど 1 回ずつ訪れ、 0, 0 へ戻ってくる方法は何通りか?

Page 26: AtCoder Regular Contest 046

例(サンプル 1)

• 𝐻 = 2,𝑊 = 2

→ 2通り

Page 27: AtCoder Regular Contest 046

例(サンプル 2)

• 𝐻 = 6,𝑊 = 3

→ 3通り

Page 28: AtCoder Regular Contest 046

考察 (1)

•仮に、マス①から→へ移動するとする。

Page 29: AtCoder Regular Contest 046

考察 (1)

• マス②を訪れるためには、マス③から→へ移動しなければならない。

Page 30: AtCoder Regular Contest 046

考察 (1)

•連鎖的に、→へ移動しなければならないマスが決まっていく。

Page 31: AtCoder Regular Contest 046

考察 (1)

•仮に、マス①から↓へ移動するとする。

Page 32: AtCoder Regular Contest 046

考察 (1)

• マス②を訪れるためには、マス③から↓へ移動しなければならない。

Page 33: AtCoder Regular Contest 046

考察 (1)

•連鎖的に、↓へ移動しなければならないマスが決まっていく。

Page 34: AtCoder Regular Contest 046

考察 (1)

•結局、青のレーンはすべて同じ向きへ移動しなければならない。

Page 35: AtCoder Regular Contest 046

考察 (1)

•同様に、赤や緑のレーンはすべて同じ向きへ移動しなければならない。

• ここで、レーンの本数 𝑑は 𝑑 = GCD 𝐻,𝑊 と計算できる。

Page 36: AtCoder Regular Contest 046

考察 (1)

•最初の 𝑑歩の向きを決めると、

Page 37: AtCoder Regular Contest 046

考察 (1)

•最初の 𝑑歩の向きを決めると、全体の向きが一意に決まる。

• しかも、最初の 𝑑歩の繰り返しになっている!

Page 38: AtCoder Regular Contest 046

考察 (1)

• 「すべてのマスをちょうど 1 回ずつ訪れ、 0, 0 へ戻ってくる」ためには、「最初の 𝑑歩を繰り返す」ことが必要条件。

Page 39: AtCoder Regular Contest 046

考察 (2)

• しかし、「最初の 𝑑歩を繰り返す」ことは必要十分条件ではない。

•先の例は、すべてのマスを訪れる前に 0, 0 へ戻ってしまっている。

Page 40: AtCoder Regular Contest 046

考察 (2)

•最初の 𝑑歩を全通り試し、すべてのマスを訪れているか個別にチェックする?

→ 最初の 𝑑歩は 2𝑑通りもあるので、TLE してしまう。

Page 41: AtCoder Regular Contest 046

考察 (2)

• 「最初の 𝑑歩の行き先」は 𝑑 + 1通りしかないので、全通り試せる。

•最初の 𝑑歩をまとめて、紫の矢印で表す。

Page 42: AtCoder Regular Contest 046

考察 (2)

•紫の矢印は 𝑑歩分なので、紫の矢印を𝐻𝑊

𝑑回繰り返して 0, 0 へ

戻ってくれば、すべてのマスを訪れたことになる。

Page 43: AtCoder Regular Contest 046

考察 (2)

• OK の例

Page 44: AtCoder Regular Contest 046

考察 (2)

• NG の例

Page 45: AtCoder Regular Contest 046

考察 (2)

• 紫の矢印を何回繰り返すと 0, 0 へ戻ってくるか?

• 紫の矢印が右へ 𝑥マス、下へ 𝑦マス移動するとする。(ただし、𝑥 + 𝑦 = 𝑑)

• 紫の矢印の横方向の周期はW

GCD 𝑊,𝑥

• 紫の矢印の縦方向の周期はH

GCD 𝐻,𝑦

• よって、紫の矢印が 0, 0 へ戻ってくるまでの周期は

LCMW

GCD 𝑊, 𝑥,

H

GCD 𝐻, 𝑦

Page 46: AtCoder Regular Contest 046

解法

• 𝑑 = GCD(𝐻,𝑊)を計算する。

• 𝑥 ≥ 0,𝑦 ≥ 0,𝑥 + 𝑦 = 𝑑 を満たす 𝑥, 𝑦 の組を全探索する。

•各 𝑥, 𝑦 の組に対して、

LCMW

GCD 𝑊, 𝑥,

H

GCD 𝐻, 𝑦=𝐻𝑊

𝑑ならば、 𝑥+𝑦

𝑥を答えに足す。

•計算量は O 𝑑 log 𝑑