莫队算法简介

莫队算法是一种用于高效处理离线区间查询问题的算法,由莫涛(Mo Tao)在2009年提出。其核心思想是通过对查询区间进行分块排序,利用前一次查询的结果来减少计算量,从而将时间复杂度优化至接近线性。

莫队的基本实现步骤:

示范:洛谷P2709 小B的询问

1.定块长

将块长定为 n\sqrt{n}n 时间复杂度较为平均。
核心代码:

len=sqrt(n);

2.排序

将询问输入并进行排序。
核心代码:

bool cmp(node x,node y)
{if(x.l/len!=y.l/len)return x.l<y.lelse return x.r<y.r;
}

使用奇偶性优化。
就是如果 lll 在的块是奇数块,那么 rrr 按照从小到大排序,否则按照大从小排序。

bool cmp(node x,node y)
{if(x.l/len!=y.l/len)return x.l<y.l;else{if(!((x.l/len)&1))//[0,len]是第一个块{return x.r<y.r;}else{return x.r>y.r;}}
}

3.移动区间,获得答案

核心代码:

for(int i=1,l=1,r=0;i<=m;i++)
{while(b[i].l<l)add(--l);//加上l-1while(b[i].r>r)add(++r);//加上r+1while(b[i].l>l)del(l++);//减去l,将l右移while(b[i].r<r)del(r--);//减去r,将r左移ans[b[i].id]=sum;//注意要用排序前的顺序
}

addaddadd :

void add(int x)
{if(a[x]<=k)sum-=box[a[x]]*box[a[x]];box[a[x]]++;if(a[x]<=k)sum+=box[a[x]]*box[a[x]];
}

使用平方差公式优化:

void add
{box[a[x]]++;if(a[x]<=k)sum+=2*box[a[x]]-1;
}

deldeldel :

void del(int x)
{if(a[x]<=k)sum-=box[a[x]]*box[a[x]];box[a[x]]--;if(a[x]<=k)sum+=box[a[x]]*box[a[x]];
}

使用平方差公式优化:

void del(int x)
{if(a[x]<=k)sum-=2*box[a[x]]-1;box[a[x]]--;
}

4.输出答案

for(int i=1;i<=m;i++)
{cout<<ans[i]<<'\n';
}

完整代码

#include<bits/stdc++.h>
using namespace std;
const int N=1e5 + 7,M=1e5 + 7;
int n,m,len,num,a[N],sum=0,box[N],k;
int ans[M];
struct node
{int l,r,id;
}b[M];
bool cmp(node x,node y)
{if(x.l/len!=y.l/len)return x.l<y.l;else{if(!((x.l/len)&1)){return x.r<y.r;}else{return x.r>y.r;}}
}
void add(int x)
{box[a[x]]++;if(a[x]<=k)sum+=2*box[a[x]]-1;
}
void del(int x)
{box[a[x]]--;if(a[x]<=k)sum-=2*box[a[x]]+1;
}
int main()
{cin>>n>>m>>k;len=sqrt(n);for(int i=1;i<=n;i++){cin>>a[i];}for(int i=1;i<=m;i++){cin>>b[i].l>>b[i].r;b[i].id=i;}sort(b+1,b+m+1,cmp);for(int i=1,l=1,r=0;i<=m;i++){while(b[i].l<l)add(--l);while(b[i].r>r)add(++r);while(b[i].l>l)del(l++);while(b[i].r<r)del(r--);ans[b[i].id]=sum;}for(int i=1;i<=m;i++){cout<<ans[i]<<'\n';}return 0;
}

核心思想

莫队算法通过将查询区间按特定顺序排序,利用滑动窗口的思想减少重复计算。通常将序列分成大小为 n\sqrt{n}n 的块,并根据块号和第二关键字对查询进行排序。

适用场景

莫队算法适用于:查询离线处理(必须)
可以通过增加或删除一个元素快速更新区间信息
问题不要求强制在线
基本实现步骤:
将查询区间按左端点所在块排序,若在同一块则按右端点排序。初始化当前区间为[0, -1],然后依次处理每个查询,通过移动左右指针来调整区间范围,同时维护当前区间的统计信息。

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

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

相关文章

板卡两个ADC,一个JESD204b sync正常,另一个JESD204B同步不上的问题

目录 1.问题来源: 2.问题分析 进一步测试表现: 抓取204B高速链路数据如上所示。 说明不是配置流程的问题 1.问题来源: 在工控机上和部分电脑上面出现时钟锁不住的现象,无法正常使用板卡。 经过分析,发现板卡上有两片ADC,其中一片的ADC的sync信号经过测量,是正常的,…

Android10 系统休眠调试相关

Android10 系统休眠调试相关实时打印休眠日志(实测好像没作用)&#xff1a;echo 1 > /sys/module/printk/parameters/console_suspend查看唤醒锁&#xff1a;cat sys/power/wake_lock msm8953_64:/ # cat sys/power/wake_lock PowerManager.SuspendLockout PowerManagerServ…

一文掌握Bard机器翻译,以及用python调用的4种方式(现已升级为 Gemini)

文章目录一、Bard机器翻译概述1.1. Bard机器翻译介绍1.2 Bard机器翻译的核心特点1.3 技术背景1.4 与同类模型对比二、Bard机器翻译案例2.1 官方 REST API&#xff08;推荐生产&#xff09;2.2 通过Google Cloud API调用2.3 私有化部署方案2.4 开源镜像 PyBard&#xff08;无需 …

Kafka-Eagle 安装

Kafka-Eagle官网 1&#xff09;上传压缩包 kafka-eagle-bin-2.0.8.tar.gz 到集群第一台的/opt/modules 目录 2&#xff09;解压到本地 tar -zxvf kafka-eagle-bin-2.0.8.tar.gz 3&#xff09;将 efak-web-2.0.8-bin.tar.gz 解压至/opt/installs cd kafka-eagle-bin-2.0.8 …

接口请求的后台发起确认

场景讲解做业务开发时经常遇到这些场景&#xff0c;在后端代码执行命中了些业务规则&#xff0c;需要前端用户确认一下再往下执行。示例1&#xff1a;后端判断申请1笔超过5万的资金时会发起监管流程&#xff0c;告诉前端操作用户风险并询问是否确认执行。示例2&#xff1a;数据…

完整学习MySQL

DML 等术语概念 DML&#xff08;Data Manipulation Language&#xff0c;数据操纵语言&#xff09;&#xff1a; DML主要用于插入、更新、删除和查询数据库中的数据。常见的DML语句包括&#xff1a; INSERT&#xff1a;用于向表中插入新的数据行。UPDATE&#xff1a;用于修改…

大模型笔记1——李宏毅《2025机器学习》第一讲

本篇笔记内容1、学习本节课需要的前置知识了解大模型的训练过程&#xff1a;预训练、后训练、强化学习&#xff08;2024年生成式AI导论前8讲&#xff09;了解基础机器学习、深度学习概念&#xff08;如transformer&#xff09;&#xff08;2021年机器学习课程&#xff09;2、本…

CSS scrollbar-width:轻松定制滚动条宽度的隐藏属性

在前端设计中&#xff0c;滚动条往往是一个容易被忽略的细节。默认的滚动条样式常常与页面设计格格不入&#xff0c;尤其是宽度 —— 过宽的滚动条会挤占内容空间&#xff0c;过窄又可能影响用户操作。而 CSS 的scrollbar-width属性&#xff0c;就像一把 “精细的尺子”&#x…

小迪23年-28~31-js简单回顾

前端-js开发 课堂完结后欲复习巩固也方便后续-重游-故写此篇 从实现功能过渡到涉及的相关知识点 知识点 1、 JS 是前端语言&#xff0c;是可以被浏览器“看到”的&#xff0c;当然也可以被修改啊&#xff0c;被浏览器禁用网页的 JS 功能啊之类的。所以一般都是前后端分离开发&…

JavaScript 概述

JavaScript 是一种高级、解释型编程语言&#xff0c;主要用于网页开发&#xff0c;使其具备动态交互功能。它是网页三大核心技术之一&#xff08;HTML、CSS、JavaScript&#xff09;&#xff0c;能够直接嵌入 HTML 页面并在浏览器中执行。核心特性动态弱类型语言 JavaScript 是…

Mermaid流程图可视化系统:基于Spring Boot与Node.js的三层架构实现

什么是Mermaid?系统架构设计 三层架构 overview架构交互流程 核心组件详解 1. Spring Boot后端2. Node.js中间层3. 前端界面 功能实现 1. 节点和关系管理2. 流程图渲染3. 主题切换4. 导出功能 使用指南 启动步骤页面操作 总结与展望 什么是Mermaid? Mermaid流程图可视化系统…

R 数据框:高效数据处理与分析的利器

R 数据框:高效数据处理与分析的利器 引言 在数据科学和统计分析领域,R语言因其强大的数据处理能力和丰富的统计模型而备受推崇。R数据框(data frame)是R语言中一种重要的数据结构,它以表格形式存储数据,使得数据的组织、操作和分析变得简单高效。本文将深入探讨R数据框…

论文阅读笔记:《Curriculum Coarse-to-Fine Selection for High-IPC Dataset Distillation》

论文阅读笔记&#xff1a;《Curriculum Coarse-to-Fine Selection for High-IPC Dataset Distillation》1.背景与动机2.核心贡献3.方法详解4.实验结果与贡献主体代码算法整体逻辑CVPR25 github 一句话总结&#xff1a; CCFS基于组合范式&#xff08;轨迹匹配选择真实图像&…

【Linux系统】详解,进程控制

前言&#xff1a; 上文我们讲到了Linux中的虚拟空间地址&#xff0c;知道了一个进程对应一个虚拟地址空间&#xff0c;虚拟空间地址与物理地址之间通过页表映射....【Linux】虚拟地址空间-CSDN博客 本文我们来讲一讲Linux系统是如何控制进程的&#xff01; 如果喜欢本期文章&am…

Matplotlib(五)- 绘制子图

文章目录一、子图概述1. 子图介绍2. 子图布局2.1 网格布局2.2 自由布局二、绘制等分区域子图1. 使用 plt.subplot() 绘制子图示例&#xff1a;绘制多个子图示例&#xff1a;工业月度同比情况2. 使用 plt.subplots() 绘制子图示例&#xff1a;绘制多个子图示例&#xff1a;部分国…

C++中互斥锁、共享锁深度解析

一&#xff0c;互斥锁互斥锁&#xff08;Mutex&#xff0c;全称 Mutual Exclusion&#xff09;是并发编程中用于保护共享资源的核心同步机制。它通过确保同一时间仅有一个线程访问临界区&#xff08;Critical Section&#xff09;&#xff0c;解决多线程环境下的数据竞争和不一…

Qt中的QWebSocket 和 QWebSocketServer详解:从协议说明到实际应用解析

前言 本篇围绕 QWebSocket 和 QWebSocketServer&#xff0c;从协议基础、通信模式、数据传输特点等方面展开&#xff0c;结合具体接口应用与实战案例进行说明。 在实时网络通信领域&#xff0c;WebSocket 技术以其独特的全双工通信能力&#xff0c;成为连接客户端与服务器的重要…

机器学习 —— 决策树

机器学习 —— 决策树&#xff08;Decision Tree&#xff09;详细介绍决策树是一种直观且易于解释的监督学习算法&#xff0c;广泛应用于分类和回归任务。它通过模拟人类决策过程&#xff0c;将复杂问题拆解为一系列简单的判断规则&#xff0c;最终形成类似 “树” 状的结构。以…

车规MCU软错误防护技术的多维度分析与优化路径

摘要&#xff1a;随着汽车电子技术的飞速发展&#xff0c;微控制单元&#xff08;MCU&#xff09;在汽车电子系统中的应用日益广泛。然而&#xff0c;大气中子诱发的单粒子效应&#xff08;SEE&#xff09;对MCU的可靠性构成了严重威胁。本文深入探讨了软错误防护技术在车规MCU…

原生微信小程序实现语音转文字搜索---同声传译

效果展示 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/23257ce3b6c149a1bb54fd8bc2a05c68.png#pic_center 注意&#xff1a;引入同声传译组件请看这篇文章 1.search.wxml <view class"search-page"><navigation-bar title"搜索" …