P3901 数列找不同
莫队
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstdio>
using namespace std;
const int N=100006;
int n,m,l,r,nu,q;
int ar[N],num[N],ans[N];
struct node{
int x,y,z;
}a[N];
int get(){
char zy=getchar();
int z=1,y=0;
while(zy>'9'||zy<'0'){
if(zy=='-')z=-1;
zy=getchar();
}
while(zy>='0'&&zy<='9'){
y=y*10+zy-'0';
zy=getchar();
}
return z*y;
}
bool cmp(node a,node b){
return (a.x/q)==(b.x/q)?a.y<b.y:(a.x/q)<(b.x/q);
}
void add(int p){
num[ar[p]]++;
if(num[ar[p]]==2)nu++;
}
void del(int p){
num[ar[p]]--;
if(num[ar[p]]==1)nu--;
}
int main(){
n=get();m=get();
q=sqrt(n);
for(int i=1;i<=n;i++){
ar[i]=get();
}
for(int i=1;i<=m;i++){
a[i].x=get();
a[i].y=get();
a[i].z=i;
}
sort(a+1,a+1+m,cmp);
for(int i=1;i<=m;i++){
while(r<a[i].y)add(++r);
while(l>a[i].x)add(--l);
while(r>a[i].y)del(r--);
while(l<a[i].x)del(l++);
if(!nu) ans[a[i].z]=1;
}
for(int i=1;i<=m;i++){
if(ans[i]) printf("Yes\n");
else printf("No\n");
}
return 0;
}

浙公网安备 33010602011771号