比赛 数据结构模板题 评测结果 AAAAAAAAAA
题目名称 HH的项链 最终得分 100
用户昵称 LikableP 运行时间 1.483 s
代码语言 C++ 内存使用 8.95 MiB
提交时间 2025-04-15 19:03:39
显示代码纯文本
// 普通莫队 
#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
using namespace std;

const int MAXN = 5e4;
const int MAXM = 2e5;
const int MAXV = 1e6;
const int LEN = 250;

struct QUESTION {
	int l, r;
	int id;
	int ans;
} ques[MAXM + 10];

bool cmp1(QUESTION x, QUESTION y) {
	if (x.l / LEN == y.l / LEN) {
		return x.r < y.r;
	}
	return x.l < y.l;
}

bool cmp2(QUESTION x, QUESTION y) {
	return x.id < y.id;
}

int n, m;
int a[MAXN + 10];
int t[MAXV + 10];

int main() {
	freopen("diff.in", "r", stdin);
	freopen("diff.out", "w", stdout);
	scanf("%d", &n);
	for (int i = 1; i <= n; ++i) {
		scanf("%d", &a[i]);
	}
	scanf("%d", &m);
	for (int i = 1; i <= m; ++i) {
		scanf("%d %d", &ques[i].l, &ques[i].r);
		ques[i].id = i;
	}
	
	sort(ques + 1, ques + m + 1, cmp1);
	int nl = ques[1].l, nr = ques[1].r;
	for (int i = nl; i <= nr; ++i) {
		t[a[i]]++;
		if (t[a[i]] == 1) ques[1].ans++;
	}
	for (int i = 2; i <= m; ++i) {
		ques[i].ans = ques[i - 1].ans;
		while (nl < ques[i].l) {
			t[a[nl]]--;
			if (t[a[nl]] == 0) ques[i].ans--;
			nl++;
		}
		while (nl > ques[i].l) {
			nl--;
			t[a[nl]]++;
			if (t[a[nl]] == 1) ques[i].ans++;
		}
		while (nr < ques[i].r) {
			nr++;
			t[a[nr]]++;
			if (t[a[nr]] == 1) ques[i].ans++;
		}
		while (nr > ques[i].r) {
			t[a[nr]]--;
			if (t[a[nr]] == 0) ques[i].ans--;
			nr--;
		}
	}
	
	sort(ques + 1, ques + m + 1, cmp2);
	for (int i = 1; i <= m; ++i) {
		printf("%d\n", ques[i].ans);
	}
	return 0;
}