G - Div. 1 & Div. 2 Editorial
by
maspy
Color-Coding というテクニックを使用します.Color-Coding で解く方法もいろいろあると思うので,以下は一例です.
(問題ではなく)カテゴリを,ランダムに色 0, 1 で塗ります.そのあと,次の問題をときます.
- 問題:\(A, B, C, D, E, F\) を選んでください.ただし,\(A, B, E, F\) は色 \(0\) から選んでください.\(C, D\) は色 \(1\) から選んでください.\((A,B), (C,D), (E,F)\) 間ではカテゴリが異なるようにしてください.
これで,手前 \(2\) 問,中央 \(2\) 問,後半 \(2\) 問で制約を分離できます.カテゴリに対して色 \(0\) を確率 \(2/3\),色 \(1\) を確率 \(1/3\) で割り当てるようにすると,固定した解が上の問題の解として得られる確率は \(p=16/729\) 以上です(\(16/729\) というのは,最適解に現れるカテゴリが \(6\) 種と思って計算してしまっていますが,\(A\) と \(E\) が同じカテゴリなどの場合には,色 \(0\) を引くべきものの種類数が減るので単に成功率は上がります.)
乱択して解くことを \(500\) 回程度行えば,誤答率 \(10^{-5}\) 以下程度が保証できます(確率 \(p\) で当たりが出るくじびきを \(N\) 回やると,失敗し続ける確率は \(e^{-Np}\) 程度.と近似すると暗算でも見積もれますし,プログラムを書いてチェックしてもよいでしょう).
なお,確率 \(1/2\) ずつで \(0,1\) を割り当てても成功率 \(1/64\) で,上の方法より若干悪くなりますが,解法には影響しません.
あとは問題を \(O(N)\) 時間で解きます.これは top 2 を管理するタイプの dp で解けます.
- \(A\) 部分を選んだ時点での情報:(面白さ, \(A\) のカテゴリ) の top 2
- \(B\) 部分を選んだ時点での情報:面白さ最大値
- \(C\) 部分を選んだ時点での情報:(面白さ, \(C\) のカテゴリ) の top 2
- \(D\) 部分を選んだ時点での情報:面白さ最大値
- \(E\) 部分を選んだ時点での情報:(面白さ, \(E\) のカテゴリ) の top 2
- \(F\) 部分を選んだ時点での情報:面白さ最大値
posted:
last update: