公式

D - Triangle Card Game 解説 by nok0


Alice が最初に出すカード \(a\) を全探索します.全ての初手に対して Bob が勝てるかを判定できればよいです.

Bob は以下を満たすカード \(b\) を出すと勝つことができます.

  • \(|a-b| < c < a+b\) なる \(c\)\(A\setminus \lbrace a\rbrace\) に存在しない.

\(a,b\) の大小関係で場合分けをします.

\(b <a\) ならば,最小のものを出して損しないので,最小のものが条件を満たすか判定すればよいです.

\(b\geq a\) ならば, \(b-a < c < b+a\) なる \(c\)\(A\setminus \lbrace a\rbrace\) に存在しないような \(b\) があるかを高速に判定できれば良いです.つまり,\(\mathrm{dist}(b)\) を, \({}^\forall c\in A \setminus \lbrace a\rbrace, \min(|b-c|)\) で定めると,\(\mathrm{dist}(b)\)\(a\) 以上であるような要素が存在するかが分かればよいです.

\(\mathrm{dist}(b)\) の更新が,各要素について高々定数回しか起こらないことに注意すれば,以上は set を用いて実装できます.

なお,\(b\geq a\) ならばという条件は外し,最小のものの確認と,全要素についての \( \mathrm{dist}\) の確認のみでも問題ありません.なぜなら \(b<a\) の場合,確認すべき \(a-b < c<b+a\) に要素が存在しないという条件は, \(b-a < c<b+a\) に要素が存在しないという条件より真に厳しいからです.この工夫をすると実装が少し軽くなります.

投稿日時:
最終更新: