Mo's algorithmの幅と計算量

投稿日: 更新日:

Mo's algorithm の区間の幅と計算

区間の個数をQ\sqrt{Q}個やN\sqrt{N}個にするパターンがあって分からなかったから調べた。

備忘録として書いた。

上の画像のように縦に区切る幅をWWと設定すると計算量は以下のように求まる

数列の長さをNN、クエリの個数をQQとすると

  • ↓↑の移動回数・・・WQWQ
  • →の移動回数・・・N2W\frac{N^2}{W}

よって合計N2W+WQ\frac{N^2}{W} + WQ

これを最小にするWWを求めれば良い。

相加相乗平均の関係より

N2W+WQ2N2Q\frac{N^2}{W} + WQ \geqq 2\sqrt{N^2 Q}

等号成立は

N2W=WQW=NQ\frac{N^2}{W} = WQ \\ W = \frac{N}{\sqrt{Q}}

となる。よって区間の個数はQ\sqrt{Q}個が最適となる。

定数倍を考慮した場合

定数倍を考慮するとW=3N2QW = \frac{\sqrt{3}N}{\sqrt{2Q}}となるなしい

参考: https://nyaannyaan.github.io/library/misc/mo.hpp.html

書いた人

profile_image

お茶の葉

物理とプログラミングが好きな人