莫队求调
查看原帖
莫队求调
754856
_zexal_楼主2022/10/6 23:02

rt,代码如下,后5个点WA了

#include<bits/stdc++.h>
using namespace std;
const int Maxn=5e5+5;
int n,m,a[Maxn],belong[Maxn],answer[Maxn],vis[20005],ans;
struct node{
	int l,r,id;
}q[Maxn];
bool cmp(node a,node b){
	if(belong[a.l]==belong[b.l]){
		if(belong[a.l]%2) return a.r<b.r;
		else return b.r<a.r;
	}
	return a.l<b.l;
}
void add(int number){
	vis[a[number]]++;
	if(vis[a[number]]==1) ans++;
}
void del(int number){
	vis[a[number]]--;
	if(vis[a[number]]==0) ans--;
}
int main(){
	cin>>n>>m;
	int len=sqrt(n);
	int belen=ceil((double)n/len);
	for(int i=1;i<=belen;i++)
		for(int j=(i-1)*len+1;j<=i*len;j++)
			belong[j]=i;
	for(int i=1;i<=n;i++){
		cin>>a[i]; 
	}
	for(int i=1;i<=m;i++){
		cin>>q[i].l>>q[i].r;
		q[i].id=i;
	}
	sort(q+1,q+1+m,cmp);
	int l=0,r=0;
	for(int i=1;i<=m;i++){
		while(l<q[i].l) del(l++);
		while(l>q[i].l) add(--l);
		while(r<q[i].r) add(++r);
		while(r>q[i].r) del(r--);
		if(ans==(q[i].r-q[i].l+1)) answer[q[i].id]=1;
	}
	for(int i=1;i<=m;i++) if(answer[i]==0) cout<<"No"<<endl; else cout<<"Yes"<<endl;
	return 0;
}
2022/10/6 23:02
加载中...