莫队算法·初探总结
莫队算法分那么几类: 普通序列 带修改 树上 回滚 支持在线 其实上述的类型还可以组合起来( 非常的毒瘤 )。 个人理解莫队算法的精髓在于如何利用暴力将答案再合理的时间和空间内跑出来。说白了: \[莫队算法=一种很牛逼的自定义排序+分块处理+暴力 \] 首先要理解自定义排序,这个排序之后整个序列可以最快地处理所有的询问(这里暂时不谈第五类问题(支持在线),这里认为莫队是只能离线处理问题的,必须先把所有的问题都离线下来)。怎么为之快,快要看左端点移动的总距离+右端点移动的总距离最小。那么一般用块的奇偶性来排序就够快了。如下: bool cmp(const node &a,const node &b) { return (p[a.l]^p[b.l])?(p[a.l]<p[b.l]):((p[a.l]&1)?(a.r<b.r):(a.r>b.r)); } 排完序后大致移动的次数就在可控的范围内了。 其次是分块,因为一般这种序列题的复杂度是 \(O(\frac{n^2}{S}+mS)\) ( \(n\) 是序列长度, \(m\) 是询问次数, \(S\) 是块大小)。 那么用均值不等式去分析这个复杂度就好了。一般 \(n\) , \(m\) 同阶的时候取 \(\sqrt n\) 最优,但是假如 \(n\) 和 \(m\) 有别的情况的话具体分析,有时候还要决定用时间换空间来保证空间也过得去