概要
- この記事 の手法の一部を掘り下げたものです.少し適用例が集まったので記事化.
残念ながら,計算量オーダーの証明はしていないです,HELP.→ 解決しました.
簡単な例
手法の説明のため,次の自明な問題を考えます.
もちろんこれは,ソートして大きいものから足すだけで解けるのですが,その解法は一旦忘れます.
計算量は劣るものの,自然な解法のひとつとして, dp による解法を考えます.次のように dp[i][j] を定義して適切に計算すれば,この問題は
- dp[i][j]:
のうちから 個選んだときの総和の最大値.
この解法を乱択アルゴリズムを利用して高速化します.
簡単のため,最適解のひとつを固定し,最適解が唯一であるかのように記述します.
長さ
入力をシャッフルしましょう.すると,
許容できる誤答確率
任意の
このように
以下は,
100 | 50 | 11 | 12 | 13 | 14 | 15 | 16 |
1000 | 500 | 35 | 39 | 42 | 46 | 49 | 51 |
10000 | 5000 | 111 | 123 | 134 | 145 | 154 | 163 |
100000 | 50000 | 352 | 390 | 426 | 458 | 489 | 517 |
1000000 | 500000 | 1112 | 1235 | 1346 | 1449 | 1545 | 1636 |
上の数表などから,次が成り立つと考えました.
【定理】
ランダムウォークで期待値からの乖離の最大が
→ 既存研究があることを教えていただきました!ありがとうございます!(https://twitter.com/knewknowl/status/1691489279762161664)
ランダムウォークというよりは,sampling without replacement というような検索ワードが適しているようです.少し調べたところ,
例えばこの論文の定理 2.4 で
結局,上の表のような
問題例
想定解とは異なる別解として本記事の手法を使うことができる問題たちです.想定解には触れません.
https://codeforces.com/contest/436/problem/E
これは
なお本問題では解の復元を要求しており,しかも
解答例:https://codeforces.com/contest/436/submission/218884165
本問は別の言い方とすると,長さ
https://codeforces.com/contest/739/problem/E
div1 の 3000 点の問題なので,まあまあ高難易度に置かれている問題です.
列が 2 つあっても同じことができます.ランダムシャッフルの結果,列
あとは簡単な dp によって,誤答確率
計算量は,愚直 dp での
なお,シャッフルをすることにより任意の入力に対して誤答確率を小さくできるというのが本記事の手法の良さでもありますが,そもそもテストケースが何らかのランダムによって作られたりしていれば入力をシャッフルしなくても AC したりします.
解答例:https://codeforces.com/contest/739/submission/218639365
https://codeforces.com/contest/1799/problem/F
これも上の問題と同様,
解答例:https://codeforces.com/contest/1799/submission/218644087
https://atcoder.jp/contests/past202005-open/tasks/past202005_o
総和が
私がこの手法をはじめて目にしたのがこの問題の QCFium さんによる解説 です.この記事では,
適用できない場合
添字シャッフルが本質なので,添字の隣接などに意味があるとこの手法は適用できません.
とはいえ適当なランダムによってテストケースが作成されていて,分布が偏っていない最適解しか存在しないということは起こりうるかもしれません.

適当な問題で試してみると,これは 26AC / 2WA.テストケース作成者がエライ.
ランダムケースに対しては有効な場合がありそうな解法なので,どうしようもないときに実装する嘘解法としてはまあまあかもしれません.
https://codeforces.com/contest/1891/problem/E
成功例です。列から
提出:https://codeforces.com/contest/1891/submission/230828988
枝狩りによる高速化なので,原則として数え上げには使えないです.何かの確率を小数で求めるなどの状況であれば似たアイデアが使える可能性があります.
関連記事
教えていただきました.