社区讨论

莫队怎么你了但是TLE

P1972[SDOI2009] HH 的项链参与者 5已保存回复 7

讨论操作

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

当前回复
7 条
当前快照
1 份
快照标识符
@lo1cl9gt
此快照首次捕获于
2023/10/22 18:50
2 年前
此快照最后确认于
2023/11/02 19:10
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
struct node {
	int l, r, k;
}q[N];
int pos[N], ans[N], cnt[N];
int a[N];
void read(int &k) {
	int t = 0, f = 1;
	char c = getchar();
	while(c < '0' or c > '9') {
		if(c == '-') f = -1;
		c = getchar();
	}
	while(c >= '0' and c <= '9') {
		t = t * 10 + c - '0';
		c = getchar();
	}
	k = f * t;
}
bool cmp(node x, node y) {
	if(pos[x.l] != pos[y.l]) 
	    return pos[x.l] < pos[y.l];
	if(pos[x.l] & 1) 
	    return x.r > y.r;
	return x.r < y.r;
}
int Ans = 0;
void add(int x) {
	cnt[a[x]]++;
	if(cnt[a[x]] == 1) 
	    Ans++;
}
void del(int x) {
	cnt[a[x]]--;
	if(cnt[a[x]] == 0) 
	    Ans--; 
}
int m, n;
int main() {
	//std::ios::sync_with_stdio(0);
	read(n);
	int block = sqrt(n);
	for(int i = 1; i <= n; i++) {
		read(a[i]);
		pos[i] = (i - 1) / block + 1;
	}
	cin>>m;
	for(int i = 1; i <= m; i++) {
		read(q[i].l);
		read(q[i].r);
		q[i].k = i;
	}
	sort(q + 1, q + m + 1, cmp);
	int l = 1, r = 0;
	for(int i = 1; i <= m; i++) {
		while(l < q[i].l) del(l++);
		while(r > q[i].r) del(r--);
		while(l > q[i].l) add(--l);
		while(r < q[i].r) add(++r);
		ans[q[i].k] = Ans;
	}
	for(int i = 1; i <= m; i++) 
	    printf("%d\n", ans[i]);
	return 0;
}

回复

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

正在加载回复...