news 2026/7/23 3:22:37

洛谷 P2709:[模板] 莫队 / 小 B 的询问 ← 莫队算法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
洛谷 P2709:[模板] 莫队 / 小 B 的询问 ← 莫队算法

【题目来源】
https://www.luogu.com.cn/problem/P2709

【题目描述】
小 B 有一个长为 n 的整数序列 a,值域为 [1,k]。
他一共有 m 个询问,每个询问给定一个区间 [l,r],求:
其中 ci 表示数字 i 在 [l,r] 中的出现次数。
小 B 请你帮助他回答询问。

【输入格式】
第一行三个整数 n,m,k。
第二行 n 个整数,表示小 B 的序列。
接下来的 m 行,每行两个整数 l,r。​​​​​​​

【输出格式】
输出 m 行,每行一个整数,对应一个询问的答案。​​​​​​​

【输入样例】
6 4 3
1 3 2 1 1 3
1 4
2 6
3 5
5 6​​​​​​​

【输出样例】
6
9
5
2

【数据范围】
对于 100% 的数据,1≤n,m,k≤10^5。

【算法分析】
● 基础莫队算法(Mo's Algorithm)​ 是一种用于解决离线区间查询问题的算法,由莫涛在 2010 年提出。莫队算法是‌基于分块思想‌构建的离线区间查询优化算法,分块为其提供‌排序依据与复杂度保障‌,两者关系可概括为"‌
莫队=离线+暴力转移+分块排序‌"。‌

● 莫队算法是一种用于解决
离线区间查询问题的算法,其核心思想是通过分块排序来优化指针移动顺序,从而降低总时间复杂度。奇偶性排序是莫队算法中的一个重要优化技巧,具体实现如下:
(1)首先,将长度为 n 的序列分成 sqrt(n) 个块;
(2)然后,将所有询问按左端点 L 所在的块编号为第一关键字排序。当左端点在同一块内时,采用奇偶性排序优化右端点 R 的顺序:若左端点位于奇数块,则右端点 R 从小到大排序;若左端点位于偶数块,则右端点 R 从大到小排序
这样可以减少右指针在块间切换时的回跳次数,进一步提升算法效率。​​​​​​​

【算法代码】

#include <bits/stdc++.h> using namespace std; typedef long long LL; const int N=1e5+5; LL a[N],cnt[N],ans[N]; LL cur; int block,n,m,k; struct Node { int le,ri,idx; } q[N]; bool cmp(Node a,Node b) { if(a.le/block!=b.le/block) { return a.le<b.le; } return a.ri<b.ri; } void add(int x) { int val=a[x]; cur+=2*cnt[val]+1; cnt[val]++; } void del(int x) { int val=a[x]; cnt[val]--; cur-=2*cnt[val]+1; } int main() { ios::sync_with_stdio(false); cin.tie(0); cin>>n>>m>>k; for(int i=1; i<=n; i++) cin>>a[i]; block=sqrt(n); for(int i=0; i<m; i++) { cin>>q[i].le>>q[i].ri; q[i].idx=i; } sort(q,q+m,cmp); int le=1,ri=0; for(int i=0; i<m; i++) { while(le>q[i].le) add(--le); while(le<q[i].le) del(le++); while(ri<q[i].ri) add(++ri); while(ri>q[i].ri) del(ri--); ans[q[i].idx]=cur; } for(int i=0; i<m; i++) { cout<<ans[i]<<"\n"; } return 0; } /* in: 6 4 3 1 3 2 1 1 3 1 4 2 6 3 5 5 6 out: 6 9 5 2 */



【参考文献】
https://blog.csdn.net/hnjzsyjyj/article/details/138976338


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/23 3:20:41

没有完美的系统:辩证法视角下的计算机架构演进与实践论

可用的系统&#xff0c;并且这种系统也需要随着现实情况的变化&#xff0c;而调整乃至于重构其自身。所以&#xff0c;整个系统不能看成是绝对稳定的&#xff0c;系统的架构会随着各种各样内外部条件的变化而不断演进&#xff0c;其总有着发生变化的趋势。由此可见&#xff0c;…

作者头像 李华
网站建设 2026/7/23 3:18:23

粉笔刷题App 与华图在线题库对比:客观评测与选型参考

引言&#xff1a;公考刷题工具的选型逻辑 公考报名人数持续走高。根据国家公务员局公布的数据&#xff0c;2024 年国考报名人数突破 300 万&#xff0c;平均竞争比约 77:1&#xff0c;部分热门岗位竞争比更高。在这样高强度的竞争环境下&#xff0c;刷题几乎是每一位考生的必修…

作者头像 李华
网站建设 2026/7/23 3:15:35

Grok AI助手:从代码审查到架构设计的全方位开发效率提升指南

最近在AI圈里有个很有意思的现象&#xff1a;大家都在讨论大模型的能力边界&#xff0c;但真正能让人眼前一亮的实用工具却不多。直到看到Elon Musk对Grok的评价——"可靠的多面手"&#xff0c;这个描述让我开始重新审视这个AI助手到底能做什么。很多人可能以为Grok只…

作者头像 李华
网站建设 2026/7/23 3:15:33

Qwen3.8模型代码生成与长文档处理技术解析

上周&#xff0c;当国内开发者社区还在讨论如何优化开源模型部署流程时&#xff0c;一条消息迅速传开&#xff1a;月之暗面与阿里巴巴联手发布了新一代模型。这个合作之所以引起广泛关注&#xff0c;不仅因为两家公司的技术背景&#xff0c;更因为它在多项关键指标上表现出的能…

作者头像 李华