莫队算法

本质上。。似乎是大暴力。。。
##传说中能解决一切区间问题的算法
如果我们**知道区间[L,R][L,R][L,R],就能在比较短的时间内求出[L−1,R],[L+1,R],[L,R−1],[L,R+1][L-1,R],[L+1,R],[L,R-1],[L,R+1][L−1,R],[L+1,R],[L,R−1],[L,R+1]**的话,那就可以用莫队算法了。

有一种经典的问题:给你一些不带修改的区间询问,要求快速回答

显然,有一些我们可以通过线段树来完成,因为线段树是O(NlogN)O(NlogN)O(NlogN)的

但是,线段树有的东西是维护不了的。

看一个例子

给你一个数列,若干询问,要求回答区间内同种颜色的数量。

线段树很难做,怎么办?

用莫队算法!

莫队算法的实质是通过将询问排序,每个询问均由前一个询问(排序后的)转移得来,通过一定的排序优化时间复杂度。往往可以有O(NN)O(N\sqrt N)O(NN​)的效果

回到题目
显然对于两次询问L,RL,RL,R和L′,R′L',R'L′,R′,知道了L,RL,RL,R的答案,就可以暴力计算∣L−L′∣+∣R−R′∣|L-L'|+|R-R'|∣L−L′∣+∣R−R′∣次得出L′,R′L',R'L′,R′的答案。

∣L−L′∣+∣R−R′∣|L-L'|+|R-R'|∣L−L′∣+∣R−R′∣。也就是曼哈顿距离

把每个询问看作是二维平面上的点,那么我们的最小总时间,就是这些点的最小曼哈顿距离生成树, 按照这个树的顺序做,复杂度变成了O(NN)O(N\sqrt N)O(NN​)(为什么?),而且这个生成树连边也有特别的技巧,可以去看莫队在知乎上推荐的那篇。https://zhuanlan.zhihu.com/p/25017840

然而这样有一点猥琐

有一个优美方便简洁好理解的替代品

分块大法好!

把整个序列分块,把LLL按照所在块的顺序为第一关键字,把RRR(RRR本身!)为第二关键字排序。

为什么要分块不能直接排呢?

分块很好的减少了一种情况的影响。

L&lt;L′&lt;L′′L&lt;L'&lt;L''L<L′<L′′,并且距离很近,但是R′&lt;R&lt;R′′R'&lt;R&lt;R''R′<R<R′′,并且R′R'R′与另外两个离得很远。如果直接按LLL排序就会浪费非常多的时间。

由于每个块的大小是N\sqrt NN​

分块使得两个询问之间差异平均到了L,RL,RL,R上。

因此,理论复杂度大约是O(NN)O(N\sqrt N)O(NN​),实际上是O(O(O(玄学??跑的过就行)))(假设询问数与序列长度同阶)

带上了修改,怎么办?

然后我们继续分块。

把二元组L,RL,RL,R变成三元组L,R,xL,R,xL,R,x。xxx是这次询问在修改第几次后。

然后把RRR所在块看作第二关键字,xxx看作第三关键字排序即可。

转移时直接恢复(或删除)两次询问之间的修改。如果在区间内还要计算对答案的影响

然而修改的复杂度不同

最优分块方式是每块N23N^{2\over 3}N32​,总共N13N^{1\over 3}N31​块
左指针移动N∗N23=N53N*N^{2\over 3}=N^{5 \over 3}N∗N32​=N35​次
右指针移动N∗N23=N53N*N^{2\over 3}=N^{5 \over 3}N∗N32​=N35​次
修改指针移动(N13)2∗N=N53{(N^{1\over 3})}^2*N=N^{5 \over 3}(N31​)2∗N=N35​次

总复杂度N53N^{5 \over 3}N35​

在实际操作中,有时取一些什么n∗10\sqrt n*10n​∗10之类的奇葩的数可能更快

有一道板题
http://blog.csdn.net/hzj1054689699/article/details/51880644

回滚莫队(仅插入无需删除)

有时候我们需要处理一些特殊情况,例如维护区间最大最小值。
加入的时候我们很好处理,但删除就不知道该怎么办了。

此时就需要一些处理技巧。

我们仍然对于询问排序,将序列分块,第一关键字为左端点所在块的位置,第二关键字为右端点位置。

对于询问左端点在同一块的情况,右端点是有序的,但左端点可能在这块中是无序的,那么我们直接将左端点定在这一块的右端,由于询问右端点是单调递增的,右端点可以不断向后扩展,碰到一个询问,我们就将当前左端点暴力移到询问的左端点,计算答案,再暴力移回当前块的右端。

可能有疑惑:这不是一样需要删除吗?
其实不然,我们可以在左移前保存状态,计算完直接恢复。或者在每个位置记录在哪里修改了,原状态是什么,回滚的时候将修改撤销即可。

与普通莫队相比,每一个询问我们仅仅是左端点多移了不超过一个块的距离,因此总复杂度仍然是mnm\sqrt nmn​的,非常优秀!

莫队算法+带修莫队+回滚莫队相关推荐

  1. 分治 —— 莫队算法 —— 带修莫队

    [概述] 普通莫队由于强制离线是不能修改的,但对于强制在线的题,可以在普通莫队的基础上强行加上一维时间轴 time,表示这次操作的时间,即在每个询问前已经完成了多少次修改. 简单来说,就是将询问 [l ...

  2. 【莫队/树上莫队/回滚莫队】原理详解及例题:小B的询问(普通莫队),Count on a tree II(树上莫队),kangaroos(回滚莫队)

    文章目录 问题引入 介绍莫队算法及其实现过程 时间复杂度 莫队算法适用范围 莫队奇偶优化 普通莫队:小B的询问 树上莫队:SP10707 COT2 - Count on a tree II 回滚莫队: ...

  3. 【洛谷P6072 [MdOI2020] Path】【回滚莫队+Trie】

    题意 给一棵 n n n个节点的树,边有边权.定义一条路径的权值为边权的异或和.找两条节点不相交的路径,使得这两条路径的权值和最大. n ≤ 30000 n\le 30000 n≤30000 分析 问 ...

  4. 莫队算法(普通莫队、带修莫队、树上莫队、不删除莫队)学习笔记【理解+套路/核心代码+例题及题解】

    一.理解 我的理解就是巧妙的暴力,利用双指针以及分块思想,巧妙的移动双指针,时间复杂度可以达到O(NlogN). 强推博客:写的又好又全.链接 二.套路 1.普通莫队 [1]核心代码 bool cmp ...

  5. 【练习】BZOJ4241: 历史研究(回滚莫队)

    题意 给定一个长度为 n n n的序列,并提出q" role="presentation">qqq个询问,每次询问要求回答区间 [l,r] [ l , r ] [l ...

  6. 【周末狂欢赛6】[AT1219]历史研究(回滚莫队),大魔法师(矩阵+线段树),单峰排列

    文章目录 T1:单峰排列 题目 题解 code T2:历史研究 题目 题解 code T3:大魔法师 题目 题解 code 我可能这辈子都更不出来狂欢赛5了,先咕咕 T1:单峰排列 题目 一个n的全排 ...

  7. AT1219-歴史の研究(历史研究)【回滚莫队】

    正题 题目链接:https://www.luogu.com.cn/problem/AT1219 题目大意 nnn个数字,mmm次询问一个区间内ti∗it_i*iti​∗i的最大值,tit_iti​即区 ...

  8. BZOJ4241历史研究题解--回滚莫队

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=4241 分析 这题就是求区间权值乘以权值出现次数的最大值,一看莫队法块可搞,但仔细想想,莫 ...

  9. 历史研究(回滚莫队)

    问题 C: 历史研究 时间限制: 1 Sec  内存限制: 128 MB 提交: 61  解决: 2 [提交] [状态] [命题人:admin] 题目描述 IOI 国历史研究的大牛--JOI 教授,最 ...

  10. 『实用教程』使用Visual Studio自带的Git管理回滚代码版本

    使用Visual Studio自带的Git管理回滚代码版本 需求: 恢复本地某一时刻的版本,并提交覆盖远程版本 操作: 拉取远程最新版本至本地 提交所有更新 操作\查看历史记录,显示所有已提交更新,然 ...

最新文章

  1. python中的logging记录日志_[ Python入门教程 ] Python中日志记录模块logging使用实例...
  2. 中国有超3亿人存在睡眠障碍 收入越高睡眠越少
  3. [会议分享]2020全球软件大会分享-PWA在项目中的最佳实践
  4. ASP+AJAX制作无刷新新闻评论系统01
  5. InheritableThreadLocal类原理简介使用 父子线程传递数据详解 多线程中篇(十八)...
  6. 校园计算机知识竞赛活动简介,徽县一中计算机爱好者社团成功举办计算机知识竞赛活动...
  7. Python《第一次爬虫遭遇反盗链(下)》
  8. html图片上下高度不一样,【已解决】HTML图片横向布局中第一张图片和其他图片高度不一致...
  9. C# 5.0 Async函数的提示和技巧
  10. python常用数据结构及算法_常用数据结构和算法汇总
  11. 能直接替代替换RC522/CV520的13.56MHz高频读写芯片,太棒了
  12. Doris 运维篇:Apache Doris 如何定位处理问题的Tablet
  13. (附源码)SSM学生网上请假系统JAVA计算机毕业设计项目
  14. 情人节程序员用HTML网页表白【粉色生日祝福网页】TML5七夕情人节表白网页源码 HTML+CSS+JavaScript
  15. php代码画表情包,canvas绘制表情包的示例代码
  16. processon画类图和时序图
  17. DCloud使用小结
  18. 广告联盟介绍之——A5广告联盟
  19. Voltus任命全球投资者关系负责人
  20. TSC03数传电台介绍,便携式基站,防护等级IP67

热门文章

  1. nyoj 小明的存钱计划
  2. RocketMQ 优雅停机技巧
  3. npm安装依赖包报ERR问题汇总及处理
  4. 查询oracle中所有的用户,如何查询Oracle中所有用户信息
  5. FINN(三)BNN在FPGA上的准确性和峰值性能
  6. 重庆大学计算机学院学术委员会,学术委员会
  7. 《女生宿舍第二部》(1-46上) 转贴
  8. Google Earth Engine——美国人口数据可视化分析
  9. # 个人日记-书籍《银河帝国2之基地与帝国》观后感-20210808
  10. python统计学课程_Python数据分析(统计分析)视频课程