莫队算法,就是巧妙处理区间问题的一种算法。
举个例子来讲一下
问题:有n个数组成一个序列,有m个形如询问L, R的询问,每次询问需要回答区间内至少出现2次的数有哪些。
一、暴力法
m次询问,每次询问循环n次,时间复杂度O(m*n)
二、巧妙点的
我们可以通过前面区间来解决后面区间的问题
比如已知[1,10],那么[1,11]就只需要再访问一次即可,而暴力却必须11次。
设置一个L,R,分别代表此刻区间的左边界和右边界。
第一次询问:[1,2],此时L = 1,R = 2
第二次询问:[1,10],此时L不变,R+8
第三次询问:[10,100],此时L+9,R+90
..........
通过这个我们就可以很巧妙得利用前面区间的内容来解决问题,但如果出现一些变态的数据,就会导致L,R来回大幅度移动,还是很容易超时
三、莫队算法
中国ACM大佬自创的算法,采用的是分块排序来将区间先排好,其他与算法二差不多。
假设有n个数据,那么每个块的数量就是根号n(这样取块效率最高)
之后,先排左区间的块,若块大小相同,再排右区间的值。
例题:<