题目大意为:给出一个序列,然后在k个查询区间中,如果该区间中的序列中没有相同的数,那么就输出yes,否则输出no。
这道题也是一道莫队的模板题,但是因为我将分块是除以len写成了除以n,导致后面五个样例点直接T了,所以莫队的效率还是挺靠分块的大小的,(虽然我写成n之后就相当于没分块了,呜嘤呜嘤)。
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e6+7;
inline int read()
{
int x=0,f=1;
char c;
c=getchar();
while(!isdigit(c))
{
if(c=='-')f=-1;
c=getchar();
}
while(isdigit(c)){
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
int num[maxn],f[maxn],ans[maxn],cnt=0;
struct node
{
int l,r,id,pos;
bool operator <(node &a)const {
return pos==a.pos? r<a.r : pos<a.pos;
}
}q[maxn];
void add(int x)
{
f[num[x]]++;
if(f[num[x]]==1)cnt++;
}
void del(int x)
{
f[num[x]]--;
if(f[num[x]]==0)cnt--;
}
int main()
{
int n,m,len;
n=read(),m=read();
len=sqrt(n);
for(int i=1;i<=n;i++) num[i]=read();
for(int i=1;i<=m;i++) q[i].l=read(),q[i].r=read(),q[i].id=i,q[i].pos=(q[i].l-1)/len+1;
sort(q+1,q+1+m);
int l=1,r=0;
for(int i=1;i<=m;i++){
int x=q[i].l,y=q[i].r;
while(l<x)del(l),l++;
while(l>x)l--,add(l);
while(r<y)r++,add(r);
while(r>y)del(r),r--;
ans[q[i].id]=(cnt==r-l+1)?1:0;
}
for(int i=1;i<=m;i++){
if(ans[i])printf("Yes\n");
else printf("No\n");
}
return 0;
}