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) で判定可能
16. 問題概要
• N 人の男性と M 人の女性がいる
• i 番目の男性は整数 Ai , Bi を持つ
• j 番目の女性は整数 Cj , Dj を持つ
• Dj ≦ Ai かつ Bi ≦ Cj となるペアの数を最大化せよ
– ただし,それぞれの人は複数のペアに所属してはならない
• 制約
– 1 ≦ N, M ≦ 150,000
– 1 ≦ Ai , Bi , Cj , Dj ≦ 109
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))