有关莫队的复杂度证明

分块+莫队

最坏复杂度为\(O(n\sqrt{m})\)

证明一下:

注意以下证明均未考虑指针所属块变动的情况,因为是排好序的,总的移动次数不超过\(n\)

我们设块长为\(S\)

首先我们将左端点所在块为第一关键字,右端点为第二关键字进行排序
这样可以保证在左端点所属块不变的情况下,右端点指针是单调递增的
,这样在最坏情况下,对于每个块的询问,有r指针最多移动\(n\),为\(O(\frac{n}{S}\cdot n)\),即为\(O(\frac{n^{2}}{S})\),在考虑左指针\(l\),在最坏情况下每次移动块长\(S\)\(m\)次询问就是\(O(mS)\),因此,总时间复杂度为

\[O(\frac{n^{2}}{S}+mS) \]

接下来我们考虑\(S\)的取值,利用均值不等式我们可以得出\(\frac{n^{2}}{S}+mS>=2\sqrt{n^{2}m}=2n\sqrt{m}\),当且仅当\(S=\frac{n}{\sqrt{m}}\)时成立(注意\(S\)的取值

因此,当块长\(S=\frac{n}{\sqrt{m}}\),莫队算法有时间复杂度

\[O(n\sqrt{m}) \]

带修莫队

带修莫队是在普通的分块+莫队的基础上,加上了时间这一指针,
在原来\(l+1,l-1,r+1,r-1\)的基础上加上了\(time+1,time-1\),若我们仍按照之前的排序方法,极有可能造成时间的来回跳动,复杂度直接乘上一个\(time\),这显然是不行的,但我们可以参照之前将左端点按块排序的思想,把右端点也按块排序,这样,把左端点所属块右端点所属块分别为第一关键字第二关键字排序,再把时间第三关键字排序,这样复杂度就可以接受了,为\(O(n^{\frac{5}{3}})\),或者说是\(O(n^{\frac{2}{3}} m^{\frac{2}{3}}t^{{\frac{1}{3}}})\)

证明:

块长为\(S\),共有\(m\)询问,每次询问左右指针最多移动\(S\),为\(O(mS)\),在考虑\(t\)造成的影响,每一种左块与右块形成的组合中\(t\)最多移动\(S\),而这样的组合有块的数量的平方种当然其实应当比这个要小一点),为\(\frac{n^{2}}{S^{2}}\),所以\(t\)造成的影响最多为\(\frac{n^{2}t}{S^{2}}\),所以总复杂度为

\[O(mS+\frac{n^{2}t}{S^{2}}) \]

接下来我们考虑\(S\)为何值时取得最小值

\[\begin{aligned} f(S)&=mS+\frac{n^{2}t}{S^{2}}\\ \end{aligned}\]

对其求导

\[f\rq(S)=m-\frac{2n^{2}t}{S^{3}} \]

导函数单调递增,因此当\(f\rq(S)=0\)时取得最小值

所以有

\[\begin{aligned} &m-\frac{2n^{2}t}{S^{3}}=0\\ \implies &S=\sqrt[3]{\frac{2n^{2}t}{m}} \end{aligned}\]

忽略掉常数\(2\)

\[S=n^{\frac{2}{3}}m^{-\frac{1}{3}}t^{\frac{1}{3}} \]

带入\(f(S)\)求得复杂度为

\[O(n^{\frac{2}{3}}m^{\frac{2}{3}}t^{\frac{1}{3}}) \]

\(n\space m\space t\)为同一量级的数字时可简化为\(n=m=t\),故当\(S=n^{\frac{2}{3}}\)时,有时间复杂度

\[O(n^{\frac{5}{3}}) \]

posted @ 2026-08-15 07:44  技技技技技  阅读(3)  评论(0)    收藏  举报