求问 P2709
查看原帖
求问 P2709
716006
Yamchip楼主2024/7/20 22:39
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int n, q, k, l, r, num, a[N], b[N], cnt[N], ans[N];
struct node
{
	int l, r, id;
}s[N];
bool cmp(node x, node y)
{
	if(b[x.l] != b[y.l])
		return x.l < y.l;
	if(b[x.l] & 1)
		return x.r < y.r;
	else
		return x.r > y.r;
}
void add(int k)
{
	num += 2 * cnt[a[k]] + 1;
    ++cnt[a[k]];
}
void del(int k)
{
	num -= 2 * cnt[a[k]] - 1;
    --cnt[a[k]];
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
	cin >> n >> q >> k;
	int len = sqrt(n);
	for(int i = 1;i <= n;i++)
		cin >> a[i], b[i] = (i - 1) / len + 1;
	for(int i = 1;i <= q;i++)
		cin >> s[i].l >> s[i].r, s[i].id = i;
	sort(s + 1, s + q + 1, cmp);
	for(int i = 1;i <= q;i++)
	{
		while(s[i].l < l) add(--l);
        while(s[i].r > r) add(++r);
		while(s[i].l > l) del(l++);
		while(s[i].r < r) del(r--);
		ans[s[i].id] = num;
	}
	for(int i = 1;i <= q;i++)
		cout << ans[i] - 1 << "\n";
	return 0;
}

为什么要减一才能过

2024/7/20 22:39
加载中...