Pile The Integer Game

2 secs 1024 MB
matcharate12's icon matcharate12

この問題では主に二分探索、ゲームのシミュレーションを問います。

最初に見るとあまり求める答えのヒントがないように思えますが、もう一度問題をじっくりと注意深く見てみましょう。ゲームのルールより、

  • プレイヤー ii はゲームを続ける度に aba\le b が成り立つような bb が書かれたカードを必ず場に出さなくてはならない

と書かれています。
このことから求める答え(ゲームを続けることのできる回数)を最大化するためには、場に出すカードに書かれた数値 bb が " aa より大きい数値の中で最小の値である" ようなカードを場に出すことが必要十分です。これを O(N)O(N) で求めると時間制限に間に合わないので、これを高速に計算するために二分探索を用いてそのような bbO(logN)O(\log_{}N) で求めることで間に合うようになります。

またプレイヤーごとにカードを場に出す動作ですが、単調増加性により配列内から削除する必要はありません。さらに、最初にプレイヤー 11 が出すカードの数値は先ほどの同様の性質から A1,1A_{1,1} を場に出すことが適切です。

以上で全体で O(NLlogL)O(NL\log_{}L) でこの問題に正解することができます。以下は解答例(C++)です。

追記:
制約上、O(NL)O(NL) が間に合います。なので必ずしも二分探索を用いて実装する必要はありませんが、それを用いるとより高速に動作することだけ伝えておきます。O(NL)O(NL) の実装方法ではここでは省略します。