小Z的袜子

OI-wiki上面关于莫队的介绍都可以看一下(特别是算法模板),这里介绍一下莫队算法时间复杂度的证明,OI-wiki那个有点看不懂

接下来设序列总长度为\(n\),询问为\(m\),块长为\(L\)

首先来看左端点移动总次数,设某个块的询问个数为\(x_i\),那么这个块内左端点移动的总长度为\(O(x_iL)\),求一个和可以知道左端点由于在块内移动的次数为\(O(mL)\);左端点还可能可以跨块移动,最坏的情况(下面设块的区间为\([l,r]\))是在每一块开始的时候左端点在\(r\),然后块内移动完了左端点在\(l\),接下来又要移动到下一块的\(r\)并重复,这样的时间复杂度为\(O(L\cdot \frac{n}{L})=O(n)\)

然后来看右端点的移动总次数,显然对于每一块块内的询问,最多走完整个序列,为\(O(n)\),最多有\(\frac{n}{l}\)个块,所以总时间复杂度为\(O(n\cdot \frac{n}{L})=O(\frac{n^2}{L})\)

综上总时间复杂度为\(O(mL+\frac{n^2}{L})\),当\(L=\frac{n}{\sqrt m}\)时最优

posted @ 2024-02-26 15:51  最爱丁珰  阅读(6)  评论(0编辑  收藏  举报