P10149 [Ynoi1999] XM66F 题解
比较好的莫队题。
思路#
考虑使用莫队解决这个问题。
我们对于每个元素,统计
那么我们每一次新加入一个元素产生的贡献为
发现我们只需要统计
可以用桶简单维护。
时间复杂度
Code#
#include <bits/stdc++.h>
using namespace std;
#define fro(i, x, y) for(int i = (x); i <= (y); i++)
#define pre(i, x, y) for(int i = (x); i >= (y); i--)
const int N = 5e5 + 10;
const int B = 800;
int n, m, a[N], t[N], b[N], pos[N];
long long num, t1[N], t2[N], ans[N];
struct Modui {
int l, r, id;
inline bool operator<(const Modui&t) const {
return pos[l] == pos[t.l] ? (pos[l] & 1 ? r < t.r : r > t.r) : l < t.l;
}
} d[N];
#define lb(x) (x&(-x))
inline void add(int x) { while(x <= n) t[x]++, x += lb(x); }
inline int ask(int x) { int r = 0; while(x) r += t[x], x -= lb(x); return r; }
inline void Add(int x) { num += abs(b[x] * t2[a[x]] - t1[a[x]]); t1[a[x]] += b[x], t2[a[x]]++; }
inline void Del(int x) { t1[a[x]] -= b[x], t2[a[x]]--; num -= abs(b[x] * t2[a[x]] - t1[a[x]]); }
signed main() {
ios::sync_with_stdio(0), cin.tie(0);
cin >> n >> m;
fro(i, 1, n) {
cin >> a[i];
}
fro(i, 1, n) {
pos[i] = (i - 1) / B + 1;
}
fro(i, 1, m) {
cin >> d[i].l >> d[i].r;
d[i].id = i;
}
sort(d + 1, d + m + 1);
fro(i, 1, n) {
b[i] = ask(a[i] - 1);
add(a[i]);
}
int l = 1, r = 0;
fro(i, 1, m) {
while(r < d[i].r) Add(++r);
while(l > d[i].l) Add(--l);
while(r > d[i].r) Del(r--);
while(l < d[i].l) Del(l++);
ans[d[i].id] = num;
}
fro(i, 1, m) cout << ans[i] << "\n";
return 0;
}
最后,感谢 @gxy001 的指导。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)