【学习笔记】回滚莫队初步总结

news/2025/10/16 16:54:21/文章来源:https://www.cnblogs.com/LinkyChristian/p/19146077

什么是回滚莫队啊(战术后仰)

首先确定一个常数$len$(一般而言取 $\sqrt{n}$ ,$n^{\frac{2}{3}}$),将数组分为$\lceil {\frac{n}{len}} \rceil$个块 对于$m$个区间询问,将其按照左端点$l$所属的块从小到大排序,然后对于左端点在同一个块内的数据吗,将右端点$r$按从小到大排序

然后枚举每个块,让我们来处理所有左端点在这个块内的询问

我们知道一个性质,左端点在同一个块内的询问,右端点从左到右排序,所以右端点是单调的,我们用一个不会回退的指针$rr$来统计右边的结果

现在来考虑左端点,虽然左端点是无序的,但是由于它们都在同一个块内,所以它们离这个块的右端点的距离都不会超过$len$,所以我们用一个可以回退的指针 $ll$ 来统计左边的答案

由于同一个块内的询问的右端点是递增的,因此 $rr$ 产生的贡献在统计这个块内询问时是永久的,不用删除,而左端点是无序的,产生的贡献需要删除。

$ll$ 和 $rr$ 都从这个区间的右端点出发,首先$rr$从上一个询问的右端点走向这一个询问的右端点,然后$ll$从块的右端点出发,向左走统计左边的贡献
,注意 $ll$ 统计的贡献是临时的,因此统计完之后要让$ll$从此询问的左端点回归到块的右端点,同时删除贡献。

以下是需要注意的几点

  1. 需要有一个不会归零的量记录$rr$统计到的贡献
  2. 左右端点在同一个块内的询问可以直接暴力,反正也就O($len$)的复杂度

来考虑复杂度,对于一个区块内的询问,指针 $rr$ 最多从这个区块右端点移动的序列右端点,最多移动 $n$ 次,最多有$\lceil {\frac{n}{len}} \rceil$个区间,所以复杂度最多为O($nlen$)。

对于单个询问,指针 $ll$ 在这个块内移动,每个询问最多移动$len$ 次,对于所有的 $m$ 个询问,最多移动O($mlen$)次。

因为 $m$ , $n$同级,可以证明算法的复杂度为O($nlen$),大多数情况复杂度为O($n\sqrt n$)

回滚莫队有一个好处,即只需要增操作,不需要减操作,对与某些无法实现减操作(比如查询最大值)的题目尤其好用

例题:P3380【模板】回滚莫队&不删除莫队

#include<bits/stdc++.h>
#define N 200010
using namespace std;
int n,m,a[N],las[N],tmp[N],qlen,qn,bel[N],mr[N],ans[N],st[N],ed[N],num[N],cnt;
struct node{int l,r,id;
}qt[200010];
bool cmp(node a1,node a2) {return (bel[a1.l]==bel[a2.l])?(a1.r<a2.r):(bel[a1.l]<bel[a2.l]);}
int calc(int l,int r) {int res=0;for(int i=l; i<=r; i++) las[a[i]]=0;for(int i=l; i<=r; i++) (las[a[i]]==0)?(las[a[i]]=i):(res=max(res,i-las[a[i]]));return res;
}
int main()
{cin>>n;qlen=sqrt(n);for(int i=1; i<=n; i++) {cin>>a[i];tmp[i]=a[i],bel[i]=(i-1)/qlen+1;mr[bel[i]]=i;}qn=bel[n],mr[bel[n]]=n;sort(tmp+1,tmp+n+1);int tn=unique(tmp+1,tmp+n+1)-tmp-1;for(int i=1; i<=n; i++) a[i]=lower_bound(tmp+1,tmp+tn+1,a[i])-tmp;cin>>m;for(int i=1; i<=m; i++) {cin>>qt[i].l>>qt[i].r;qt[i].id=i;}sort(qt+1,qt+m+1,cmp);int now=1;for(int i=1; i<=qn; i++) {int l=mr[i]+1,r=l-1,mx=0;cnt=0;while(bel[qt[now].l]==i) {if(bel[qt[now].r]==i) {ans[qt[now].id]=calc(qt[now].l,qt[now].r),now++;continue;} while(r<qt[now].r) {r++;ed[a[r]]=r;if(!st[a[r]]) st[a[r]]=r,num[++cnt]=a[r];mx=max(mx,r-st[a[r]]);}int t1=mx;while(l>qt[now].l) {l--;if(!ed[a[l]]) ed[a[l]]=l;else mx=max(mx,ed[a[l]]-l);}ans[qt[now].id]=mx;while(l<=mr[i]) {if(ed[a[l]]==l) ed[a[l]]=0;l++;} mx=t1;now++;}for(int j=1; j<=cnt; j++) st[num[j]]=ed[num[j]]=0;}for(int i=1; i<=m; i++) cout<<ans[i]<<endl;return 0;
}

AT1219歴史の研究

#include<bits/stdc++.h>
#define N 500010
using namespace std;
long long n,q,a[N],bel[N],qlen,mr[N],ans[N],bac[N],num[N],cnt,bac2[N],tmp[N],dui[N];
struct node{long long l,r,id;
}pt[100010];
bool cmp(node a1,node a2) {return (bel[a1.l]==bel[a2.l])?(a1.r<a2.r):(bel[a1.l]<bel[a2.l]);
}
long long calc(long long l,long long r) {long long res=0;for(long long i=l; i<=r; i++) bac2[a[i]]=0;for(long long i=l; i<=r; i++) bac2[a[i]]+=dui[a[i]],res=max(res,bac2[a[i]]);return res;
}
int main()
{cin>>n>>q;qlen=sqrt(n);for(long long i=1; i<=n; i++) {cin>>a[i];tmp[i]=a[i];bel[i]=(i-1)/qlen+1,mr[bel[i]]=i;}sort(tmp+1,tmp+n+1);int tn=unique(tmp+1,tmp+n+1)-tmp-1;for(int i=1; i<=n; i++) {int tp=a[i];a[i]=lower_bound(tmp+1,tmp+tn+1,a[i])-tmp;dui[a[i]]=tp;}for(long long i=1; i<=q; i++) {cin>>pt[i].l>>pt[i].r;pt[i].id=i;}sort(pt+1,pt+q+1,cmp);long long now=1;for(long long i=1; i<=bel[n]; i++) {long long l=mr[i]+1,r=l-1,mx=0;cnt=0;while(bel[pt[now].l]==i) {if(bel[pt[now].r]==i) {ans[pt[now].id]=calc(pt[now].l,pt[now].r);now++;continue;}while(r<pt[now].r) r++,bac[a[r]]+=dui[a[r]],mx=max(mx,bac[a[r]]),num[++cnt]=a[r];long long tp=mx;while(l>pt[now].l) l--,bac[a[l]]+=dui[a[l]],mx=max(mx,bac[a[l]]);ans[pt[now].id]=mx;while(l<=mr[i]) bac[a[l]]-=dui[a[l]],l++;now++,mx=tp;}for(long long j=1; j<=cnt; j++) bac[num[j]]=0;}for(long long i=1; i<=q; i++) cout<<ans[i]<<endl;return 0;
}

upd2022/1/20:只删回滚莫队

与前面提到的只加回滚莫队相反,只删回滚莫队通过将询问左端点按块递增排序,将左端点在同一个块内的询问按右端点降序排序,$l$ 指针复位时回到块的最左端而不是最右端, $r$ 指针从右往左扫来实现只有删除操作的效果。

例题:P8078 [WC2022] 秃子酋长

这种莫队的例题比较稀少,目前也只找到一道。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/938360.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MATLAB中基于 S-V模型进行毫米波信道建模与仿真

MATLAB中基于Saleh-Valenzuela(S-V)模型进行毫米波信道建模与仿真 S-V模型能较好地描述毫米波信道中的多径成分以簇(cluster)形式到达的特性。毫米波频段(30-300 GHz)的信号传播具有显著的路径损耗和大气衰减(例…

python之模块

python之模块 一、模块的介绍组织python 1、python模块,是一个python文件,一个.py文件,半酣python对象定义和poytho语句 2、模块能够有逻辑的组织代码 3、把相关的代码分配到一个模块里能让你的代码更好用,更易懂。…

2025 年电动阀门厂推荐榜:电动/气动/高压/真空阀门厂,上海巨良阀门凭技术与口碑领跑行业

在《“十四五” 智能制造发展规划》等政策推动下,工业自动化升级加速,阀门作为流程工业的 “神经中枢”,其智能化、可靠性需求在石油化工、新能源、核工业等多领域持续攀升。2025 年中国控制阀市场规模预计突破 500…

认知与困境

我的问题是,我对身边的人。对他们的认知,好像有问题。还有一些社会的规则,是我对他们太信认了。我之所以有这样的感觉是因为,我最近的改变是从。我从那本治疗焦虑的书上的一些内容开始的。书上面介绍了美国精神类的…

【学习笔记】线性基

模拟赛遇到一个笨比线性基题但是忘了怎么求编号......最后因读入T掉来不及修改赛后20s过题,惨痛教训。 线性基是一组极小的用于表达一个数集异或空间的基底。其满足以下性质: 1.能由原数集异或得到的任意一个数,线性…

rest_framework框架视图集整理

from rest_framework.generics import GenericAPIView from rest_framework.request import Request from rest_framework import filters from rest_framework import mixins from rest_framework import generics fr…

x86_64架构__rdtsc指令

__rdtsc指令用于读取处理器的时间戳计数器,该计数器计算自上次复位以来的时钟周期数。这对性能监控和基准测试非常有用。 以下示例为linux环境上Demo#include <stdio.h> #include <x86intrin.h> #include…

AT_joisc2021_c フードコート (Foodcourt)

换维扫描线好题。 发现删除操作会出现过删(即删除的个数大于序列中元素数),这个很难处理。 思考一下应该能想到将每次询问查询的 \(b\to cnt_{del}+b\) 其中 \(cnt_{del}\) 为在该询问之前这个序列删除的数的个数,…

SPP question regarding Issues Due To Gaming Spoofers

Checking SPP Registry Key [Incorrect ModuleId Found]在windows下遇到该问题时,或许可以考虑导入如下的注册表文件。 下载 SPP ref: Issues Due To Gaming Spoofers

类型安全ORM的高并发场景解决方案 - 实践

类型安全ORM的高并发场景解决方案 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "M…

L06_mybatis读取MySQL数据库(懵逼版)

由于上课完全听不懂,又不会java,经过三天折磨,查阅各种网站,总算解决了,一个,,,,,小小小小作业。 1.创建一个项目,如果IDEA为2024版,左上角File-》new-》Project按照上面图片配置就好了。 2.需要加载的依赖…

提供给第三方接口的验证方法

第三方调用(认证方式时效限制5分钟)该 postman 调用 url 为样例 url请求头: AuthorizationBasicMTIzOmRjOTg0ZDY4NzJjNWZkYWFkZDllZDg4ZGE5ZmU5ZDYwZDc40TkxMzA0NWFmNjhkMjNiMzE4NzUzZTRhYTIWMDU= 请求头: Timestamp20…

【2025最新】6款免费DLL修复工具推荐:彻底解决“XXX.dll缺失”问题!

系统频繁弹出“XXX.dll缺失”提示?本文汇总6款2025年最新免费DLL修复工具,包括金山毒霸电脑医生、迅捷DLL助手、360安全卫士等,一键扫描自动修复系统缺失DLL,支持Win7/10/11,让你的电脑秒恢复稳定运行。电脑运行时…

2025 年注浆管生产厂家最新推荐排行榜:聚焦 0.3mm 精度与国企合作案例,助力基建企业精准挑选优质供应商

在基建工程中,注浆管是保障防渗加固、隧道支护等环节安全的关键材料,其质量直接决定工程使用寿命与施工安全。当前市场上,部分厂家为压缩成本,选用低强度钢材、忽视品控,导致管材抗压不足、壁厚不均,频繁出现破裂…

vue 下拉框 vxe-select 实现人员选择下拉列表

vue 下拉框 vxe-select 实现人员选择下拉列表 使用自定义选项插槽的方式,可以灵活的实现各种类型的下拉选择 官网:https://vxeui.com github:https://github.com/x-extends/vxe-pc-ui gitee:https://gitee.com/x-e…

双核A53+开源生态,ZX7981P Wi-Fi6 5G插卡路由器开发板CPE内核新选择!

双核A53+开源生态,ZX7981P Wi-Fi6 5G插卡路由器开发板CPE内核新选择!在物联网技术飞速发展的今天,一款出色的开发平台能够极大加速产品研发进程。启明智显推出的ZX7981P Wi-Fi6 5G插卡路由器开发板,正是为高效开发…

2025 高效过滤器制造企业最新推荐榜:供货商定制方案深度解析及口碑评级

在环保水处理与空气净化行业升级提速的背景下,精密过滤器的定制适配性直接决定项目达标效率与运营成本。当前市场呈现 “两极分化” 态势:老牌企业虽经验丰富,但部分定制方案创新不足;新兴品牌虽灵活度高,却因缺乏…

最后防线 解题报告

简要题意 给定一棵 \(n\) 个节点的有根树,每个点有点权 \(a\)。求出一个访问顺序,使得所有点都在其祖先之后被访问,设第 \(i\) 个节点是第 \(p_i\) 个被访问到的,最小化 \(\sum \limits_{1\ le i \le n}p_ia_i\)。…

2025 年试验箱厂家 TOP 企业品牌推荐排行榜,氙灯老化 / 紫外老化 / 冷热冲击 / 恒温恒湿 / 高低温 / 快速温变 / 盐水喷雾 / 高温老化 / 砂尘 / 淋雨试验箱公司推荐!

2025 年试验箱厂家 TOP 企业品牌推荐排行榜,氙灯老化 / 紫外老化 / 冷热冲击 / 恒温恒湿 / 高低温 / 快速温变 / 盐水喷雾 / 高温老化 / 砂尘 / 淋雨试验箱公司推荐!引言在现代工业生产与科研活动中,试验箱作为模拟…

系统修复

cmd中文显示异常:chcp 936 (临时方法)打开控制面板--时钟和区域--区域--管理--更改系统区域设置-当前系统区域设置为中文(简体中国) 查看上一次是什么应用程序唤醒了电脑可以以管理员模式启动命令提示符(CMD),…