首页 > 代码库 > [学习-思考-探究]莫队算法 曼哈顿最小生成树与分块区间询问算法

[学习-思考-探究]莫队算法 曼哈顿最小生成树与分块区间询问算法

前段时间刷了一些莫队算法的题目,这里记录了一些理解和思考。
莫队算法
算法
莫队算法用于解决一类可以由区间[l,r]的答案可以快速转移出区间[l-1,r],[l+1,r],[l,r+1],[l,r-1]的区间离线询问问题。
我们假设转移的复杂度是c
莫队算法的"本质"是把把每一个区间看成平面上的点,l是横坐标,r是纵坐标。
由点(l0, r0)转移到(l, r)的复杂度是(|l-l0|+|r-r0|)c。转移次数即是两点之间的曼哈顿距离。
所以对所有的询问作曼哈顿最小生成树可以避免不必要的计算。
莫队算法采用了分块思想,把整个区间分成$\sqrt{n}$个小区间,以询问左端点所在区间为第一关键字,右端点位置为第二关键字排序。
可以保证时间复杂度是$O(n*\sqrt{n})$
具体的步骤这里略过。
这样做一定是最优的吗?
实际上求曼哈顿最小生成树有$O(nlog{n})$的算法,莫队算法中求得的不是曼哈顿最小生成树。
考虑如果平面上有n/2个点,保证任意两点之间的曼哈顿距离大于等于$/sqrt{n}$(这里指的是近似值...不过显然是可以做到的),它们的曼哈顿最小生成树有n/2-1条边。
总长度自然也就大于等于$n*\sqrt{n}$(忽略系数..)因此,莫队算法这样的做法是较优的,如果求曼哈顿最小生成树,算法复杂度仍是$O(n*/sqrt{n})$。

[学习-思考-探究]莫队算法 曼哈顿最小生成树与分块区间询问算法