1. 笔记
莫队算法的思想是在离线查询时通过调整查询的顺序,优化总复杂度。当利用前一次查询的结果处理后一次结果的复杂度与两次查询的曼哈顿距离相关时,可以使用莫队算法。例如,一维查询将所有查询由小到大排序,从小到大处理查询。二维查询从方便角度考虑(不用曼哈顿最小树),可以将其中一维(如x维)分块,查询的排序遵循先按分块排,再按另一维(y)排顺序。
考虑二维查询。设查询的两维规模分别是n,m,共q次查询,将n分为k份。则复杂度是(O(qk+frac{mn}{k})+O(frac{n}{k}(m+k))),将n分为(sqrt{n})块时,复杂度大致是(O(nsqrt{n}))
2. 代码
int block_size=316;
struct Query
{
int a,b,id,block;
Query(){}
Query(int x,int y,int z):a(x),b(y),id(z){block=a/block_size;}
bool operator < (const Query q)const{return block<q.block||(block==q.block&&b<q.b);}
}q[maxn];