有关莫队的复杂度证明
分块+莫队
最坏复杂度为\(O(n\sqrt{m})\)
证明一下:
(注意以下证明均未考虑指针所属块变动的情况,因为是排好序的,总的移动次数不超过\(n\))
我们设块长为\(S\)
首先我们将左端点所在块为第一关键字,右端点为第二关键字进行排序
这样可以保证在左端点所属块不变的情况下,右端点指针是单调递增的
,这样在最坏情况下,对于每个块的询问,有r指针最多移动\(n\)次,为\(O(\frac{n}{S}\cdot n)\),即为\(O(\frac{n^{2}}{S})\),在考虑左指针\(l\),在最坏情况下每次移动块长\(S\),\(m\)次询问就是\(O(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}}\)时,莫队算法有时间复杂度
带修莫队
带修莫队是在普通的分块+莫队的基础上,加上了时间这一指针,
在原来\(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}}\),所以总复杂度为
接下来我们考虑\(S\)为何值时取得最小值
设
对其求导
导函数单调递增,因此当\(f\rq(S)=0\)时取得最小值
所以有
忽略掉常数\(2\)
有
带入\(f(S)\)求得复杂度为
当\(n\space m\space t\)为同一量级的数字时可简化为\(n=m=t\),故当\(S=n^{\frac{2}{3}}\)时,有时间复杂度

浙公网安备 33010602011771号