以下の内容はhttps://prd-xxx.hateblo.jp/entry/2024/07/30/000457より取得しました。


「K番目に⚪︎⚪︎」のにぶたん(二分探索)への直し方

先日こんな問題が出ました ABC364-D K-th Nearest

(概要)

数直線上にN個の点があるので、以下のクエリにQ個答えてください。

  • N個の点のうち座標xからK番目に近い点との距離を求めよ

NQ{10}^5ありうるので、愚直に調べるのはTLEします。

じつは

  • K番目に近い点の距離を求めよ

という問題はにぶたん (二分探索) が相性が良いです。

にぶたんで解ける問題にするために、問題の言い換えが必要なのですが、
これは筆者がとても苦手としていて毎回10分ぐらい悩むので、次に出てきたら使えるようにメモしておきます。
以下が結論です。 

  • xからK番目に近い点の距離を求めよ

↓(言い換え)

  • xから距離d以下の点が何個ある?」の答えがK個以上になる最小のdはいくつ?

です。
どういうこと?ほんとにそうなの?は後述するとして、この言い換えができれば
「距離d以下の点が何個ある?」の問いに高速に答えられれば、にぶたんが使える!となります。

実際、この問題ではxの左右両側を調べる必要がある点に注意ですが、
xdが決まっていれば
bisect_right(A, x+d) - bisect_left(A, x-d) 等のようにすれば「xから距離d以下の点の個数」が求まります
これを使ってにぶたんをすると問題をACできます (にぶたん in にぶたん 1)

どういうこと?ほんとにそうなの?

左右を見る問題はちょっと複雑なので単純にします。

距離に限らず、比較可能な数値であれば適用できます。
ソートされた数列があり、これの「小さい方からK番目」を求めることにします。2

 A = [1,2,2,3,4,4,5,6 ]

これの、
「小さい方からK番目」の値
と、
a以下の値は何個?」の答えがK個以上になる最小のaはいくつ?
の答えが一致することを確認します。

まず、a以下の値は何個?を小さい方から調べてしまいます。 

  • 0以下の値は?: 0
  • 1以下の値は?: 1
  • 2以下の値は?: 3
  • 3以下の値は?: 4
  • 4以下の値は?: 6
  • 5以下の値は?: 7
  • 6以下の値は?: 8

のようになっています。 
例えば K=4のときを見ていきます。 
aが小さい方から見ていって、a以下の値は?が初めて4個以上になるのは、確かにa=3の時で、A4番目の値は3です。 
また、K=5のとき、 
a以下の値は?が初めて5個以上になるのは、a=4の時で、A5番目の値は4です。 
同様に、K=6のとき、
a以下の値は?が初めて6個以上になるのは、a=4の時で、A6番目の値は4です。 

他の場合を試しても、確かに言い換えが正しいことがわかります。3 

(おまけ) 言い換えのバリエーション

  • 「スコアが小さい方からK番目の人」を求めよ

↓ (言い換え)

①「スコアa以下の人は何人?」の答えがK人以上になる最小のaはいくつ?
②「スコアaより大の人は何人?」の答えが(N-K)人を超えない最大のaはいくつ?
③「スコアa以上の人は何人?」の答えが(N-K+1)人以上になる最大のaはいくつ?
④「スコアa未満の人は何人?」の答えが(K-1)人を超えない最小のaはいくつ?


  • 「スコアが大きい方からK番目」「大きい方からK位」の場合は以下の通りです。

↓ (言い換え)

⑤「スコアa以上の人は何人?」の答えがK人以上になる最大のaはいくつ?
⑥「スコアa未満の人は何人?」の答えが(N-K)人を超えない最小のaはいくつ?
⑦「スコアa以下の人は何人?」の答えが(N-K+1)人以上になる最小のaはいくつ?
⑧「スコアaより大の人は何人?」の答えが(K-1)人を超えない最大のaはいくつ?


頑張ってバリエーションを考えてみたものの、とりあえず①と⑤があれば良さそうですかね。^^

おわり

にぶたんマスターになろう!


  1. 界隈では「log2つ」とかよく言われますね NやlogNの大きさなどにもかなりよりますが、2つまでならPyPyでギリギリ通るようになってることが多いです
  2. 「小さい方からK番目」「小さい方からK位」ときたらこのパターンを引き出せるようにしたいですね
  3. もっと論理的な説明ができればかっこよかったんですが「実例を確認する」にしてお茶を濁したゴリラです...



以上の内容はhttps://prd-xxx.hateblo.jp/entry/2024/07/30/000457より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14