莫队算法,就是巧妙处理区间问题的一种算法。
举个例子来讲一下
问题:有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(这样取块效率最高)
之后,先排左区间的块,若块大小相同,再排右区间的值。
例题:
HH的项链
HH有一串由各种漂亮的贝壳组成的项链。HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一
段贝壳,思考它们所表达的含义。HH不断地收集新的贝壳,因此他的项链变得越来越长。有一天,他突然提出了一
个问题:某一段贝壳中,包含了多少种不同的贝壳?这个问题很难回答。。。因为项链实在是太长了。于是,他只
好求助睿智的你,来解决这个问题。
Input
第一行:一个整数N,表示项链的长度。

莫队算法是一种处理区间问题的有效方法,通过分块排序优化区间查询。例如,在一个包含重复元素的序列中,对于形如L, R的询问,需要找出区间内至少出现2次的数。暴力方法的时间复杂度为O(m*n),但莫队算法能显著提高效率。具体实现包括对块进行排序,并利用前一次查询的结果来处理后续查询,避免大规模的区间移动。题目示例是关于贝壳项链的,要求求解不同贝壳种类在特定区间内的数量,给出了输入输出样例以及AC代码。"
117668545,8154431,UI设计与交互设计的区别及学习路线解析,"['UI设计', '交互设计', '设计工具', 'Web设计', '移动端设计']
最低0.47元/天 解锁文章
2432

被折叠的 条评论
为什么被折叠?



