莫队算法讲解 (详尽版)
莫队算法我早有耳闻。。可惜前不久才去学习。
但是自己看了看论文,也就1h左右,就能够全部理解了。
也就是说其实这个算法不难。。
好了,让我们进入正题。
我们首先来看一道例题:
Description
有n个数字,给出k,以及m个查询。
每次查询的格式是L,r,求L~r(左右包含)这个区间内数字的出现次数刚好是k的数字种数。
范围:n<=30000,k<=n,m<=30000,1<=L<r<=n,数列中元素大小<=n。
输入n,k,m,然后n个元素,然后m行查询,对于每一个询问,输出正确的答案。
Example input:
5 2 3
1 2 3 2 2
1 2
2 4
1 5
Example output:
0 //没有
1 //2
0 //没有(2太多了,也不算)
我们来考虑一下这题的解法。
首先肯定可以万能暴力,每次L~r枚举。时间复杂度O(N*M)。
但是这样的暴力是没有前途的!我们来考虑一下新的暴力:
一开始指针区间0->0,然后对于一个查询,我们将Left指针逐步更新成新的L,Right同理。
比如一开始Left=2,Right=3,而L=1,r=5。
那么我们Left-1,并且把Left位置上的数字出现次数+1.
Right+1,把Right位置上的数字出现次数+1,直到Right=5为止。
框架:
add(x){ //把x位置的数字加入进来cnt[x]++;if (cnt[x]==k) ans++;
}
remove(x){ //把x位置的数字移出去cnt[x]--;if (cnt[x]==k-1) ans--;
}
然后以上面题目为例;这种方法需要离线处理,我们同理来看一下解法:
Left=Right=1; add(1);
ans=0;
for u=1 to m{while (Left<L[u]){ remove(Left); Left++;}while (Left>L[u]){ Left--; add(Left);}while (Right<r[u]){ Right++; add(Right};}while (Right>r[u]){ remove(Right); Right--;}output ans;
}
这里说明一下,其实remove(Left);Left--;等等可以直接写成remove(Left--)等等,我这么写是为了理解。
分析一下时间复杂度,我们可以从Left和Right的移动量来分析:
每一个新的询问,Left和Right的移动量最大都会是O(N)
所以这样子的方法时间复杂度仍然是O(N*M),而且可能比上面的暴力更慢。
但是莫队算法的核心,就是从这么一个算法转变过来的。
现在来介绍一下莫队算法解决这道题:
对询问进行分块,我们知道m个询问,L和r的范围都在n以内,我们根据L和r的大小来对询问分块。
比如n=9,有以下的询问:
2 3
1 4
4 5
1 6
7 9
8 9
5 8
6 8
对于n=9,我们以根号n为每个块block的大小,这里block=3.
那么我们把1~3分成一组,4~6,7~9.
对于每一个询问(L,r),我们以L的范围来决定这个询问在哪一个块。
然后每一个独自的块内,我们让询问r更小的排在更前面。
那么上面的询问就可以分组成:
(2,3)/(1,4)/(1,6)和
(4,5)/(5,8)/(6,8)和
(7,9)/(8,9)
这一步的排序操作,我们可以在排序的时候加入判断条件cmp:
bool cmp(Query x,Query y){if ((x/block)!=(y/block))return x.L<y.L; //不同块的时候return x.r<y.r; //同一块的时候
}
排序之后,我们再来分析一下时间复杂度;接下来我们会看到神奇的事情!!
刚才分析此方法的时候,我们是从L和R的偏移量分析的;我们仍然用这种方法来分析。
考虑一下在同一个块的时候。由于L的范围是确定的,所以每次L的偏移量是O(√N)
但是r的范围没有确定;r的偏移量是O(N)。
那么从一个块到另一个块呢?
明显地,r我们不需要作考虑,仍然是O(N)。
而L明显最多也是2*√N,而且这种情况下,很快就会到下下一块。所以也是O(√N)
由于有√N(根号N)个块,所以r的总偏移量是O(N*√N)
而M个询问,每个询问都可以让L偏移O(√N),所以L的总偏移量O(M*√N)
注意了,时间复杂度分析的时候一定要注意,r的偏移量和询问数目是没有直接关系的。
而L则恰恰相反;L的偏移量我们刚才也说明了,它和块的个数没有直接关系。
所以总的时间复杂度是:
O((N+M)*√N)
很神奇地看到了,我们仅仅改变了一下问题求解的次序,就让时间复杂度大幅度下降!
当然在这个说明过程中我们也看到了,事实上,莫队是一个必须离线的算法。
意味着一些题目如果强制在线,那么莫队就无能为力了。
代码就不总结了,可以看上面的分块的地方,也可以看一些莫队的题目的题解。
莫队算法讲解 (详尽版)相关推荐
- 数据结构题(莫队算法)
数据结构题 题目: 问在区间[l,r]和[l1,r1]内x的出现次数的乘积是多少? 题解: 莫队算法的模板题 关于莫队算法你可以参考这个 我这里简单的说说我对莫队的理解: 莫队是一个优雅的暴力,就是将 ...
- 曼哈顿距离最小生成树与莫队算法(总结)
曼哈顿距离最小生成树与莫队算法(总结) 1 曼哈顿距离最小生成树 曼哈顿距离最小生成树问题可以简述如下: 给定二维平面上的N个点,在两点之间连边的代价为其曼哈顿距离,求使所有点连通的最小代价. 朴 ...
- 【BZOJ2038】小Z的袜子,第一次的莫队算法
传送门 写在前面:莫队竟如此暴力-- 思路:当初我对这个题的第一感觉--这个区间问题可以用线段树或者树状数组?答案当然是不能,于是我就去简单学了下莫队算法.在我看来,莫队(分块版,不是二维曼哈顿距离什 ...
- 【学习笔记】莫队算法
莫队算法 确实是看过的最良心的讲解: https://www.cnblogs.com/CsOH/p/5904430.html 问题:有n个数组成一个序列,有m个形如询问L, R的询问,每次询问需要回答 ...
- 【笔记篇】莫队算法(一)
P.S.:这个星期写了一个星期的莫队,现在也差不多理解了,下周该学点别的了(其实是被long long卡得生活不能自理......快要写吐了). 在本文开始之前,先orz莫涛-- 莫队算法(Mo's ...
- NBUT 1457 Sona(莫队算法+离散化)
[1457] Sona 时间限制: 5000 ms 内存限制: 65535 K 问题描述 Sona, Maven of the Strings. Of cause, she can play the ...
- XOR and Favorite Number CF340E 莫队算法
题目链接 题意:求给定询问区间[L,R]问有多少连续区间异或值等k,多次询问可以离线. a[i]^a[i+1]^a[i+2]^a[n]=(a[1]^a[2]^a[3]^...^a[i-1])^(a[1 ...
- Hdu 6534 Chika and Friendly Pairs 莫队算法+树状数组
题目链接 题意求给区间[L,R]中有少对(i,j)满足i<j且abs(a[i]-a[j])<=k. 首先来说暴力的方法就是离散化,然后用树状数组来维护,但是m次询问,m很大,所以说一定会t ...
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose)【莫队算法裸题学习笔记】
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MB Submit: 9894 Solved: 4561 [Su ...
最新文章
- 跨库查询(OpenDataSource)与链接服务器(Linking Server)
- Ubuntu 12.10使用apt安装Oracle/Sun JDK
- 2010-04-25 搞定aftr
- AJAX-服务器响应
- 李涓子 | 机器智能加速器:大数据环境下知识工程的机遇和挑战
- 本科生手握十余篇SCI,达博士毕业要求后,他获顶级名校全奖直博offer
- sql 异常除非另外还指定了 TOP、OFFSET 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效。...
- matlab回归问题,机器学习笔记(一)—— 线性回归问题与Matlab求解
- 算法设计与分析学习心得
- IDM:从Google Drive快速直接下载大文件
- 航空三字代码表_航空公司二字及三字代码表
- Java 图标logo的由来
- windows设置定时任务并运行python脚本(windows任务计划)
- 基于自适应参数及小生境的改进鲸鱼优化算法
- Android程序员该如何进阶?,2021Android面经
- 成都榆熙:拼多多商家如何批量设置产品属性值?
- 是德科技34901A支持的量程
- HTML,css和JavaScript的基础学习—html篇
- Unity开发OpenXR | (二)使用 OpenXR 制作一款简单VR示例场景 的全过程详细教程,包含两个实战案例。
- 【无人驾驶 | 国内篇】主要玩家介绍
热门文章
- php empty 包含 isset,phpempty php empty和isset的区别
- 图片质量估计-如何判定一个人脸是否为阴阳脸(第一弹:python版本)
- 他曾经是个王者,后来。。。
- Set集合的特点,遍历方式,去重原理,排序方式
- 三星液晶拼接屏厂家有哪些 液晶拼接屏特点介绍
- jmeter随机数生成
- Scientific.Toolworks.Understand.v4.0.872.MACOSX-AMPED
- UNDO_RETENTION作用
- 火狐浏览器安装java插件下载_插件下载安装系列Eclipse/IDEA/谷歌/火狐安装插件
- 闲鱼UI快速变形利器--擎天柱