社区讨论

[+1][doge]莫队是永远卡不掉的

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

讨论操作

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

当前回复
13 条
当前快照
1 份
快照标识符
@locv2pdh
此快照首次捕获于
2023/10/30 20:13
2 年前
此快照最后确认于
2023/11/05 06:46
2 年前
查看原帖
RT
CPP
#include<bits/stdc++.h>
using namespace std;
#define belong(x) ((int)ceil((float)x/len))
inline int read(){
	int w = 0, f = 1; char ch = getchar();
	while(ch < '0' or ch > '9') {if(ch == '-') f = -f; ch = getchar();}
	while(ch >= '0' and ch <= '9') w = w*10 + ch - '0', ch = getchar();
	return w*f;
}
const int maxn = 1e6 + 5;
int N, M, a[maxn], len;
struct node{
	int l, r, id;
	inline bool operator <(const node& x) const{
		return (belong(l)^belong(x.l))?belong(l)<belong(x.l):((belong(l)&1)?r<x.r:r>x.r);
	}
}q[maxn];
int ans[maxn], sum, cnt[maxn];
inline void add(int x){
	if(!cnt[x]) sum ++;
	cnt[x] ++;
}
inline void del(int x){
	if(!(cnt[x]^1)) sum --;
	cnt[x] --;
}
int main(){
	N = read();
	for(int i=1; i<=N; i++) a[i] = read();
	len = 1620; M = read();
	for(int i=1; i<=M; i++){
		int l = read(), r = read();
		q[i] = (node){l, r, i};
	}
	sort(q+1, q+M+1);
	int l = 1, r = 0;
	for(int i=1; i<=M; i++){
		int ql = q[i].l, qr = q[i].r;
		while(l < ql) sum -= !--cnt[a[l++]];
		while(l > ql) sum += !cnt[a[--l]]++;
		while(r < qr) sum += !cnt[a[++r]]++;
		while(r > qr) sum -= !--cnt[a[r--]];
		ans[q[i].id] = sum;
	}
	for(int i=1; i<=M; i++) printf("%d\n", ans[i]);
	return 0;
}

回复

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

正在加载回复...