比赛 EYOI与SBOI开学欢乐赛6th 评测结果 AAAAAAAAAA
题目名称 充电宝 最终得分 100
用户昵称 HeSn 运行时间 5.413 s
代码语言 C++ 内存使用 14.35 MiB
提交时间 2022-09-19 21:27:13
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int MAXN = 200010;
int n, s, a[MAXN], c[MAXN], f[MAXN], pre[MAXN], sum[MAXN], ans, res;
struct node {
	int l, r, id;
}q[MAXN];
bool cmp(node x, node y) {
	if(x.l / s != y.l / s) {
		return x.l / s < y.l / s;
	}
	if((x.l / s) & 1) {
	    return x.r > y.r;
    }
	return x.r < y.r;
}
void add(int x) {
	if(!sum[a[x]]) {
		res ++;
	}
	sum[a[x]] ++;
}
void del(int x) {
	sum[a[x]] --;
	if(!sum[a[x]]) {
		res --;
	}
}
signed main() {
	freopen("charger.in", "r", stdin);
	freopen("charger.out", "w", stdout);
	scanf("%lld", &n);
	s = sqrt(n);
	for(int i = 1; i <= n; i ++) {
		scanf("%lld", &a[i]);
		pre[i] = n + 1;
	}
	for(int i = 1; i <= n; i ++) {
		if(pre[f[a[i]]]) {
			pre[f[a[i]]] = i;
		}
		f[a[i]] = i;
	}
	for(int i = 1; i <= n; i ++) {
		q[i].l = i + 1;
		q[i].r = pre[i] - 1;
		q[i].id = i;
	}
	sort(q + 1, q + n + 1, cmp);
	int l = 1, r = 0;
	for(int i = 1; i <= n; i ++) {
		while(l > q[i].l) {
			add(-- l);
		}
		while(l < q[i].l) {
			del(l ++);
		}
		while(r > q[i].r) {
			del(r --);
		}
		while(r < q[i].r) {
			add(++ r);
		}
		ans += res;
	}
	printf("%lld", ans);
    return 0;
}