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\) に要素が存在しないという条件より真に厳しいからです.この工夫をすると実装が少し軽くなります.
投稿日時:
最終更新: