码迷,mamicode.com
首页 > 编程语言 > 详细

莫队算法Mo's algorithm

时间:2018-06-09 22:07:34      阅读:205      评论:0      收藏:0      [点我收藏+]

标签:数列   span   [1]   显示   div   答案   题意   约数   出现   

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

 

给出一个长度为 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)的复杂度。
于是就谷歌大神们的解法,于是搜出一个了不得的算法--莫队算法,听名字就很厉害的样子呢!尽然是个中国人发明的==。 于是详细学习了一波:








莫队算法Mo's algorithm

标签:数列   span   [1]   显示   div   答案   题意   约数   出现   

原文地址:https://www.cnblogs.com/shawshawwan/p/9160774.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!