rt,求调,样例可以过,交WA
查看原帖
rt,求调,样例可以过,交WA
1024529
sszxyyds楼主2023/7/7 19:34

莫队求教

#include<bits/stdc++.h>
using namespace std;
int cnt [1000001];
int ans,l=1,r,m,n;
struct ttt{
	int l,r,id;
}a[200001];
int b[30001],kuai[500],daan[30001];
void jian(int x){
	cnt[b[x]]--;
	if(cnt[b[x]]==0){
		ans--;
	}
} 
void jia(int x){
	if(cnt[b[x]]==0){
		ans++;
	}
	cnt[b[x]]++;
}
void modui(int x,int y){
	while(r<y){
		r++;
		jia(r);
	}
	while(r>y){
		jian(r);
		r--;
	}
	while(l<x){
		jian(l);
		l++;
	}
	while(l>x){
		l--;
		jia(l);
	}
}
bool cmp(ttt a,ttt b){
	return kuai[a.l]==kuai[b.l]?a.r<b.r:kuai[a.l]<kuai[b.l];
//	return a.r<b.r
}
int main(){
	cin>>m;
	for(int i=1;i<=m;i++){
		cin>>b[i];
	}
	cin>>n;
	//fenkuai
	for(int i=1;i<=ceil((double)sqrt(n));i++){
		for(int j=1;j<=sqrt(n);j++){
			int spfa=sqrt(n)*(i-1)+j;
			kuai[spfa]=i;
		}
	}
	for(int i=1;i<=n;i++){
		cin>>a[i].l>>a[i].r;
		a[i].id=i;
	}
	sort(a+1,a+n+1,cmp);
	for(int i=1;i<=n;i++){
		modui(a[i].l,a[i].r);
		daan[a[i].id]=ans;//printf("%d\n",ans);
	}
	for(int i=1;i<=n;i++){
		printf("%d\n",daan[i]);
	}
	return 0;
}
2023/7/7 19:34
加载中...