普通莫队板子

news/2026/6/7 18:22:24/文章来源:https://www.cnblogs.com/hu--/p/19312999

时间复杂度为:\(O(n * \sqrt{m})\), n为数组长度,m为查询次数。

板子代码

int n, m, k;/*
a[]记录原数组。
B为块长。
res记录当前区间的答案。
c[]为辅助数组,帮助O(1)转移区间答案。
ans[]记录查询答案。
*/
int a[N];
int B, res, c[N], ans[N];/*
记录查询,以左端点所在块的块号为第一关键字,升序排序;
以右端点为第二关键字,根据块号奇偶性优化排序:(块号为奇数,升序;块号为偶数,降序)。
*/
struct query{int l, r, id;bool operator <(const query& x) const{if(l / B != x.l / B) return l < x.l;if((l / B) & 1) return r < x.r;else return r > x.r;}
}q[N];void add(int x){/* 区间外扩1格对答案的改变 */
}void del(int x){/* 区间收缩1格对答案的改变 */
}void solve(){/* 输入 */cin >> n >> m >> k;for(int i = 1; i <= n; i ++) cin >> a[i];/* 记录查询,离线处理。 */for(int i = 1; i <= m; i ++){cin >> q[i].l >> q[i].r;q[i].id = i;}/* 块长最优为 n / sqrt(m), 能保证无论数据n,m是什么,时间复杂度都是O(n * sqrt(m))。 */B = n / sqrt(m);/* 边界判断,防止B为0的特殊情况,这个非常重要。 */if(B == 0) B = 1;/* 排序 */sort(q + 1, q + 1 + m);/*处理询问。 */for(int i = 1, l = 0, r = 0; i <= m; i ++){/* 顺序很重要,要先扩张区间,然后再收缩区间,防止l > r。 */while(l > q[i].l) add(a[--l]);while(r < q[i].r) add(a[++r]);while(l < q[i].l) del(a[l++]);while(r > q[i].r) del(a[r--]);ans[q[i].id] = res - 1;}/* 输出 */for(int i = 1; i <= m; i ++) cout << ans[i] << endl;
}

示例题目

示例代码

#include <bits/stdc++.h>
#define int long long 
using namespace std;#define endl '\n'
#define fi first
#define se second
#define pb push_back
#define PII pair<int, int>
#define lowbit(x) ((x) & (-(x)))
#define all(a) a.begin(), a.end() 
#define debug(x) cout << #x << " = " << (x) << "\n";
#define vdebug(a) cout << #a << " = "; for(auto& x: a) cout << x << " "; cout << "\n";
#define vlrdebug(a, l, r) cout << #a << " = "; for(auto i = l; i <= r; i ++) cout << a[i] << " "; cout << "\n";
#define lc ((p) << 1)
#define rc ((p) << 1 | 1)const int N = 1e6 + 10, M = 1010;
const int mod = 1e9 + 7, MOD = 998244353;
const int INF = 0x3f3f3f3f;
const long long inf = 0x3f3f3f3f3f3f3f3f;
const int dx[] = {0, 0, 1, -1}, dy[] = {1, -1, 0, 0};int n, m, k;
int a[N];
int B, res, c[N], ans[N];struct query{int l, r, id;bool operator <(const query& x) const{if(l / B != x.l / B) return l < x.l;if((l / B) & 1) return r < x.r;else return r > x.r;}
}q[N];void add(int x){res += 2 * c[x] + 1;c[x] ++;
}void del(int x){res -= 2 * c[x] - 1;c[x] --;
}void solve(){cin >> n >> m >> k;for(int i = 1; i <= n; i ++) cin >> a[i];for(int i = 1; i <= m; i ++){cin >> q[i].l >> q[i].r;q[i].id = i;}B = n / sqrt(m);if(B == 0) B = 1;sort(q + 1, q + 1 + m);for(int i = 1, l = 0, r = 0; i <= m; i ++){while(l > q[i].l) add(a[--l]);while(r < q[i].r) add(a[++r]);while(l < q[i].l) del(a[l++]);while(r > q[i].r) del(a[r--]);ans[q[i].id] = res - 1;}for(int i = 1; i <= m; i ++) cout << ans[i] << endl;
}signed main(){ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);int _ = 1;// cin >> _;while(_ --) solve();return 0;
} 

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

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

相关文章

2025年Q4顶尖内容审核公司推荐:AI驱动合规时代的全场景防护指南

2025 年《人工智能生成合成内容标识办法》正式落地后,AIGC 鉴伪、多模态审核与全球化合规成为企业内容风控的核心诉求。在监管政策收紧与内容形态多元化的双重背景下,选择技术扎实、服务稳定且合规能力突出的内容审核…

Java 包装类(Wrapper Class)详细解析

Java 包装类是 基本数据类型的 “对象化封装”,核心作用是将 8 种基本数据类型(byte、short、int、long、float、double、char、boolean)转换为对象,以支持泛型、集合操作、null 值存储等场景。所有包装类均位于 j…

CAP博客集合

分布式事务,EventBus 解决方案:CAP【中文文档】 - Savorboard - 博客园 https://www.cnblogs.com/savorboard/p/cap-document.htmlCAP订阅模式详解:从基础订阅到分组订阅的完整方案-CSDN博客 https://blog.csdn.net…

完整教程:一篇最全Python 爬虫超详细讲解(零基础入门,适合小白)

完整教程:一篇最全Python 爬虫超详细讲解(零基础入门,适合小白)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &quo…

哪家初中数学家教上门服务好:五大初中数学家教机构深度分析与选择指南

近年来,在“双减”政策深化落实的背景下,初中数学辅导市场正经历结构性调整。据行业报告数据显示,2023年中国K12课外辅导市场规模约为3800亿元,并自2023年下半年起呈现温和复苏态势,预计2025年市场规模将回升至约…

$crate

在 macro_rules! 的定义中,$ 是一个特殊语法标记,用于区分普通的 Rust 代码和宏变量(Macro Variables)。 $crate 是一个特殊的“魔术”标识符,它只在 macro_rules! 宏内部可用。它的作用是解决宏路径解析的歧义。…

2025年abs更衣柜加工厂权威推荐榜单:单位更衣柜/浴场更衣柜/浴池更衣柜源头厂家精选

在办公、学校、医院、工厂乃至公共场所,储物柜是必备的设施。随着对耐用性、环保性和功能性的要求不断提高,采用ABS(丙烯腈-丁二烯-苯乙烯共聚物) 等工程塑料制造的全塑储物柜,因其耐腐蚀、抗冲击、轻便易安装、可…

2025年灰麻厂家权威推荐榜单:灰麻石花岗岩/灰麻火烧板/灰麻石材源头厂家精选

在建筑装饰、园林景观及大型工程建设领域,天然石材以其独特的质感、优异的物理性能和历久弥新的特性,始终占据着重要地位。其中,产自山东等地的灰麻花岗岩(包括黄金麻、山东白麻等主流品种)因色泽典雅、质地坚硬、…