P10149 [Ynoi1999] XM66F 题解

比较好的莫队题。

思路#

考虑使用莫队解决这个问题。

我们对于每个元素,统计 bi=j=1i[aj<ai]

那么我们每一次新加入一个元素产生的贡献为 j=lr[aj=ar](brbj)

发现我们只需要统计 j=lr[aj=ar]j=lr[aj=ar]bj

可以用桶简单维护。

时间复杂度 O(nn)

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 的指导。

作者:JiaY19

出处:https://www.cnblogs.com/JiaY19/p/18016685

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   JiaY19  阅读(21)  评论(0编辑  收藏  举报
编辑推荐:
· 从 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)
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示