SP3267 DQUERY - D-query题解 莫队算法入门
题目链接:https://www.luogu.com.cn/problem/SP3267
参考链接:https://www.cnblogs.com/cjjsb/p/9539388.html
题目大意:
区间询问共有多少不同数值。
示例程序:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 3e4 + 5, maxm = 1e6 + 5, maxq = 2e5 + 5;
struct Query {
int l, r, res, id;
} q[maxq];
int n, m, block, a[maxn], bl[maxn], cnt[maxm], ans;
bool cmp1(Query a, Query b) {
return bl[a.l] < bl[b.l] || bl[a.l] == bl[b.l] && (bl[a.l]&1 ? a.r<b.r : a.r > b.r);
}
bool cmp2(Query a, Query b) {
return a.id < b.id;
}
void add(int v) {
if (++cnt[v] == 1) ans++;
}
void del(int v) {
if (--cnt[v] == 0) ans--;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin >> n;
block = sqrt(n);
for (int i = 1; i <= n; i++) {
cin >> a[i];
bl[i] = (i - 1) / block + 1;
}
cin >> m;
for (int i = 0; i < m; i++) {
q[i].id = i;
cin >> q[i].l >> q[i].r;
}
sort(q, q+m, cmp1);
int l = q[0].l, r = q[0].l-1;
for (int i = 0; i < m; i++) {
while (r != q[i].r) {
(r < q[i].r) ? add(a[++r]) : del(a[r--]);
}
while (l != q[i].l) {
(l < q[i].l) ? del(a[l++]) : add(a[--l]);
}
q[i].res = ans;
}
sort(q, q+m, cmp2);
for (int i = 0; i < m; i++)
cout << q[i].res << endl;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
2021-04-18 《信息学奥赛一本通》例5.4 八皇后问题 题解