写了下莫队全RE是为啥啊 蒟蒻求助
查看原帖
写了下莫队全RE是为啥啊 蒟蒻求助
400468
Aakkosetsumussa楼主2023/7/5 17:14
#include<bits/stdc++.h>
using namespace std;
typedef long long inr;
const inr maxn=1000005;
inr n,m,bl,sum=0,curr,curl,answer[maxn];
inr a[maxn],cnt[maxn];
#define ri register inr
struct que {
	inr l,r,p;
} q[maxn];
inline bool cmp(que a,que b){
    return a.l==b.l?(a.l&1)?a.r<b.r:a.r>b.r:a.l<b.l;
}
inline bool add(inr pos) {
	if(++cnt[a[pos]]==1) ++sum;
}
inline bool del(inr pos) {
	if(--cnt[a[pos]]==0) --sum;
}
inline inr read() {
	inr x = 0,f = 1;
	char ch = getchar();
	while(ch < '0' || ch > '9') {
		if(ch == '-') {
			f = -1;
		}
		ch = getchar();
	}
	while(ch >= '0' && ch <= '9') {
		x = (x << 3) + (x << 1) + ch - '0';
		ch = getchar();
	}
	return x * f;
}
void write(inr x) {
	if(x < 0) {
		x = -x;
		putchar('-');
	}
	if(x > 9) {
		write(x / 10);
	}
	putchar(x % 10 +'0');
}
int main() {
	n=read();
	bl=sqrt(n);
	for(ri i=1; i<=n; i++) a[i]=read();
	m=read();
	for(ri i=1; i<=m; i++) {
		q[i].l=read(),q[i].r=read();
		q[i].p=i;
	}
	sort(q+1,q+m+1,cmp);
	for(ri i=1; i<=m; i++) {
		inr L=q[i].l,R=q[i].r;
		while(curl<L) del(curl++);
		while(curl>L) add(--curl);
		while(curr<R) add(++curr);
		while(curr>R) del(curr--);
		answer[q[i].p]=sum;
	}
	for(ri i=1; i<=m; i++) {
		write(answer[i]);
		printf("\n");
	}
	return 0;
}
2023/7/5 17:14
加载中...