尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

普通莫队板子

普通莫队板子
📅 发布时间:2026/6/20 23:10:58

时间复杂度为:\(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;
} 

相关新闻

  • 2025最新推荐!AI写作工具测评榜单,学术价值最大化
  • 2025年面包培训正规厂商推荐,专业面包培训公司与学校排名全
  • 基于MATLAB的最小生成树求解

最新新闻

  • Agentic RL基础设施实战地图:从Runtime到演化的四层构建指南
  • HandheldCompanion:5个技巧让你的掌机游戏体验完美升级
  • 如何集成Sidekiq-Statistic到Rails应用:从入门到精通
  • 如何快速排查Android问题?Android工程师进阶手册中级认知篇技巧
  • 新店起店优选|2026 淘宝代运营专业机构综合测评榜单 - 羊城派
  • VisualCppRedist AIO:5分钟解决Windows运行库问题的完整指南

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号