当前位置: 首页 > news >正文

普通莫队板子

时间复杂度为:\(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.jsqmd.com/news/62793/

相关文章:

  • 年度绩效考核推进需要注意的五大事项
  • 2025年N2氮气发泡罐批发厂家权威推荐榜单:鞋底中底发泡罐/体育器材发泡罐/高压发泡罐源头厂家精选
  • 初中数学培训全托辅导机构哪里找:全天候个性化管理,实现数学成绩全面提升的优质选择
  • 2025最新推荐!AI写作工具测评榜单,学术价值最大化
  • rust语言声明式宏特殊标识符$crate
  • 2025年面包培训正规厂商推荐,专业面包培训公司与学校排名全
  • 基于MATLAB的最小生成树求解
  • 2025年潍坊西门子直流电机维修公司权威推荐榜单:直流伺服电机维修‌/直流牵引电机维修‌/ABB直流电机维修‌‌源头公司精选
  • 2025年码头护舷订做厂家权威推荐榜单:圆筒型护舷‌/定制护舷‌/防撞护头‌‌源头厂家精选
  • 项目经理需要具备哪些硬技能与软技能?
  • 2025保安过滤器厂家综合实力榜:上海青上过滤稳居行业首选
  • 2025年钛棒过滤器权威榜单揭晓!上海青上过滤以技术革新领跑行业
  • 冒号排序
  • 微孔板恒温振荡器哪家性价比高?瑞诚仪器产品质优价廉
  • 服务好的大型工厂车间降温工业冷风机公司,车间厂房工厂通风降温/铁皮车间降温/陶瓷车间降温/炼钢车间通风降温工业冷风机公司排行榜
  • 2025年不锈钢压滤机厂家权威推荐榜单:聚焦技术实力与行业适配力
  • AI真的太好用啦!Aspire Dashboard集成GitHub Copilot。
  • 2025年灰麻厂家权威推荐榜单:灰麻石花岗岩/灰麻火烧板/灰麻石材源头厂家精选
  • 2025年炔二醇润湿剂订制厂家权威推荐榜单:非硅润湿剂/润湿剂订做/非离子型润湿剂源头厂家精选
  • 2025 年B2B海外社媒营销公司深度推荐:涵盖海外短视频营销、海外社媒运营推广公司(2025年12月新版)
  • 企业怎么在豆包上做广告?专业推广服务教你精准触达目标客户
  • 2025年工业清洗机十大品牌推荐:工业清洗机哪家好
  • 2025年工业清洗机十大品牌推荐:工业清洗机哪家好
  • 基于STM32的多路LED频闪系统设计与实现
  • 微孔板恒温振荡器品牌制造商哪家服务好?瑞诚仪器值得关注
  • 2025年海外营销推广服务商推荐与测评:涵盖Google、Facebook、TikTok、 ins、LinkedIn 等海外营销主流平台
  • 2025年酒精定制源头口碑排行,高复购率无水乙醇推荐,目前酒精源头厂家技术实力与市场典范解析
  • 智驱2025战场:军用无人机集群识别追踪,软硬一体化供应商推荐
  • 外贸出海企业必看:上海、苏州、无锡地区优秀海外营销推广代运营公司盘点(2025年12月新版)
  • 最大似然优化与交叉熵(CE)多高斯混合估计算法的应用