背景:
有点感冒,效率好低。
题目传送门:
https://www.luogu.org/problemnew/show/P3901
题意:
多组询问区间内的元素是否互不相同。
思路:
莫队模板。
水…
一遍
A
C
AC
AC。
代码:
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int n,m,now=0;
int p[100010],block[100010],hsh[100010];
bool ans[100010];
struct node{int x,y,id;} a[100010];
bool cmp(node x,node y)
{
return block[x.x]==block[y.x]?x.y<y.y:x.x<y.x;
}
void move(int x,int d)
{
if(d==1)
{
hsh[x]++;
if(hsh[x]==1) now++;
}
else
{
if(hsh[x]==1) now--;
hsh[x]--;
}
}
int main()
{
scanf("%d %d",&n,&m);
int u=sqrt(n);
for(int i=1;i<=n;i++)
{
scanf("%d",&p[i]);
block[i]=(i-1)/u+1;
}
for(int i=1;i<=m;i++)
{
scanf("%d %d",&a[i].x,&a[i].y);
a[i].id=i;
}
sort(a+1,a+m+1,cmp);
int l=1,r=0;
for(int i=1;i<=m;i++)
{
while(l<a[i].x) move(p[l++],-1);
while(l>a[i].x) move(p[--l],1);
while(r<a[i].y) move(p[++r],1);
while(r>a[i].y) move(p[r--],-1);
ans[a[i].id]=(now==a[i].y-a[i].x+1);
}
for(int i=1;i<=m;i++)
printf(ans[i]?"Yes\n":"No\n");
}