AtCoder Beginner Contest 205 [ D - Kth Excluded ] を二分探索で実装したらACならず四苦八苦した記録。方針はあってるが実装がね……
ABC205やったらD問題でハマり。
atcoder.jp
制約が 1 ≤ AN ≤
「こんなデカい数字なら二分探索だろ?きっと」
と二分探索で実装してみるもACならず。
「二分探索で解くでも充分高速だからイケる」
とコンテスト終了後、解説を読んだところ書いてあった。
「え、それなら直してみるか」
と、ちょっと直したらACになったので、何が間違ってたのか記録しておきます。
んー、くやしかー。
二分探索で解くでもイケるがnumpy + Python3で実装したコードが遅すぎ
最初の実装がnumpy + Python3.8.2で二分探索するコードで、ロジックはおしいけど無茶遅い。
numpyを配列Aの中に、何個arg以下の数値があるかのカウントに利用。
AC x 3、ほかTLEという驚きの低成績。
PyPy3 + bisect で二分探索
こりゃPython3じゃダメそうだから、PyPy3だろ。
と、方針を転換。
bisect.bisect_right で、配列Aの中に何個arg以下の数値があるかをカウントする。
この実装でTLEが無くなる。
WA x 2に。
killer_00.txt、killer_01.txtがWA。
そのコード。
二分探索の探索範囲が狭かった
WA x 2がなんで出てるのかは、二分探索の探索範囲が狭かったことが原因だった。
0 〜 + 7(=1000000000000000007)
の範囲で二分探索していたが、これが狭い。
0 〜 -1(=9223372036854775807)
にしたところAC。
制約が 1 ≤ AN ≤
だから
0 〜 + 7(=1000000000000000007)
で、大丈夫だと思ってたんだけど、なんで?まぁ、いいか。
とりあえず、killer_00.txt、killer_01.txtの答えは + 7以上の数ってことかな?
あー、実装の敗北だなー。
コードは、こんな感じ。
もっと簡潔な解法あるけど、とりあえず。