P3901 数列找不同

Miku

还是莫队板子

啥叫互不相同?区间内不同的元素的数量==区间元素数

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cmath>
using namespace std;
int l=1,r;
int cnt;
int now[100005];
struct q{
	int l;
	int r;
	int id;
}qo[100005];
int n,m;
int block[100005];
int b;
int f[100005];
int ans[100005];
bool cmp(q x, q y){
	return block[x.l]==block[y.l] ? x.r<y.r : block[x.l]<block[y.l];
}
void add(int x){
	if(now[f[x]]==0)
	cnt++;
	now[f[x]]++;
}
void del(int x){
	now[f[x]]--;
	if(now[f[x]]==0)
	cnt--;
}
int main(){
	scanf("%d%d",&n,&m);
	b=ceil(sqrt(n));
	for(int i=1;i<=b;++i){
		for(int j=(i-1)*b;j<=i*b;++j)
			block[j]=i;
	}
	for(int i=1;i<=n;++i){
		scanf("%d",&f[i]);
	}
	for(int i=1;i<=m;++i){
		scanf("%d%d",&qo[i].l,&qo[i].r);
		qo[i].id=i;
	}
	sort(qo+1,qo+1+m,cmp);
	for(int i=1;i<=m;++i){

		while(l<qo[i].l){
			del(l++);
		}
		while(l>qo[i].l){
			add(--l);
		}
		while(r<qo[i].r){
			add(++r);
		}
		while(r>qo[i].r){
			del(r--);
		}
		if(qo[i].r-qo[i].l+1==cnt){
			ans[qo[i].id]=1;
		}else{
			ans[qo[i].id]=0;
		}
	}	
	for(int i=1;i<=m;++i){
		if(ans[i])
		printf("Yes\n");
		else
		printf("No\n");
	}
	return 0;
} 
posted @ 2020-08-04 18:22  Simex  阅读(58)  评论(0编辑  收藏  举报