莫队算法Mo's algorithm

最近刷算法题遇到一个题:

给出一个长度为 n 的数列 { a[1] , a[2] , a[3] , ... , a[n] },以及 m 组询问 ( l[i] , r[i] , k[i])。
求数列下标区间在 [ l[i] , r[i] ] 中有多少数在该区间中的出现次数与 k[i] 互质(最大公约数为1)。

输入描述:

第一行,两个正整数 n , m (1 ≤ n, m ≤ 50000)。
第二行,n 个正整数 a[i] (1 ≤ a[i] ≤ n)描述这个数列。
接下来 m 行,每行三个正整数 l[i] , r[i] , k[i] (1 ≤ l[i] ≤ r[i] ≤ n, 1 ≤ k[i] ≤ n),描述一次询问。

输出描述:

输出 m 行,即每次询问的答案。


开始我的想法就是直接按题意做咯,但是最后显示时间复杂度过大没过,因为是O(mn)的复杂度。
于是就谷歌大神们的解法,于是搜出一个了不得的算法--莫队算法,听名字就很厉害的样子呢!尽然是个中国人发明的==。 于是详细学习了一波:








猜你喜欢

转载自www.cnblogs.com/shawshawwan/p/9160774.html