Official
F - 一触即発/Dangerous Chemicals Editorial by QCFium
どの薬品を混ぜてどれを混ぜないかを全て試し、それぞれの混ぜ方について
- 直ちに爆発しないか
- 直ちに爆発しないなら、新たに加えると爆発するような物質の数はいくつか
を計算します。
どの薬品を混ぜてどれを混ぜないかを全て列挙するのは、\(0\) 以上 \(2^N\) 未満の整数を列挙し、その数の \(2\) 進数表記の \(2^i\) の桁が \(1\) である場合、そしてその場合に限って薬品 \(i + 1\) を混ぜるということにすると実装がしやすいです。 (整数の \(2\) 進数表現で \(2^i\) の桁の値を取得するのは、多くの言語で bit 演算子 を使って簡潔に実装することができます)
直ちに爆発するかどうかは、\(M\) 個の爆発する混ぜ方全てについて \(3\) つの薬品が含まれているか試せばよいです。
新たに加えると爆発するような物質の数は、\(M\) 個の爆発する条件のうち、混ぜると爆発する \(3\) つの薬品のうち既に \(2\) つが入っているものについて、残りの一つの薬品にチェックを付けるなどするとよいです。
\(O(1)\) の bit 演算が利用できれば、全体の時間計算量は \(O(2^NM) = O(2^N N^3)\) となります。
posted:
last update: