社区讨论

求调莫队板子

学术版参与者 7已保存回复 14

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
14 条
当前快照
1 份
快照标识符
@lo9au22y
此快照首次捕获于
2023/10/28 08:23
2 年前
此快照最后确认于
2023/10/28 08:23
2 年前
查看原帖
P2709 全部 WA:
CPP
#include <bits/stdc++.h>
using namespace std;

const int N = 5e4 + 5;

int a[N], n, m, k, cnt[N], len, ans[N];

struct Node
{
	int id, l, r, p;
}q[N];

inline bool cmp(register const Node &a, register const Node &b)
{
	if (a.p != b.p) return a.p < b.p;
	return (a.p & 1 ? a.r < b.r : a.r > b.r);
}

inline void add(const int &x, int &res)
{
	res -= cnt[a[x]] * cnt[a[x]];
	cnt[a[x]]++;
	res += cnt[a[x]] * cnt[a[x]];
}

inline void del(const int &x, int &res)
{
	res -= cnt[a[x]] * cnt[a[x]];
	cnt[a[x]]--;
	res += cnt[a[x]] * cnt[a[x]];
}

int main()
{
	scanf("%d %d %d", &n, &m, &k);
	len = pow(n, 0.54);
	for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
	for (int i = 0; i < m; i++)
	{
		int l, r;
		scanf("%d %d", &l, &r);
		q[i] = { i, l, r, l / len };
	}
	sort(q, q + m, cmp);
	int nl = 1, nr = 0;
	for (int i = 0; i < m; i++)
	{
		int id = q[i].id, l = q[i].l, r = q[i].r, res = 0;
		while (nl < l) del(nl++, res);
		while (nl > l) add(--nl, res);
		while (nr < r) add(++nr, res);
		while (nr > r) del(nr--, res);
		ans[id] = res;
	}
	for (int i = 0; i < m; i++) printf("%d\n", ans[i]);
	return 0;
}

回复

14 条回复,欢迎继续交流。

正在加载回复...