题目描述
现有数列 A1,A2,⋯,AN,Q 个询问 (Li,Ri) , ALi,ALi+1,⋯,ARi是否互不相同
输入输出格式
输入格式:第1 行,2 个整数 N,Q
第2 行,N 个整数 ALi,ALi+1,⋯,ARi
Q 行,每行2 个整数 Li,Ri
输出格式:对每个询问输出一行,“Yes” 或者“No”
输入输出样例
输入样例#1:
4 2
1 2 3 2
1 3
2 4
输出样例#1:
Yes
No
说明
• 对于50% 的数据, N,Q≤103
• 对于100% 的数据, 1≤N,Q≤105,1≤Ai≤N,1≤Li≤Ri≤N
Solution:
数据那么小,当然就直接莫队模板拉(第一遍交,又把$10^5$当作$10000$了)。
莫队代码:
扫描二维码关注公众号,回复:
109592 查看本文章
1 // luogu-judger-enable-o2 2 #include<bits/stdc++.h> 3 #define il inline 4 #define For(i,a,b) for(int (i)=(a);(i)<=(b);(i)++) 5 using namespace std; 6 const int N=100005; 7 int pos[N],l=1,r=0,n,m,ans[N],a[N],tot[N],num; 8 struct node{ 9 int l,r,id; 10 }t[N]; 11 il bool cmp(node a,node b){return pos[a.l]==pos[b.l]?a.r<b.r:a.l<b.l;} 12 il void change(int k,int f){ 13 if(f==1){tot[a[k]]++;if(tot[a[k]]==1)num++;} 14 else {tot[a[k]]--;if(!tot[a[k]])num--;} 15 } 16 il int gi(){ 17 int a=0;char x=getchar(); 18 while(x>'9'||x<'0')x=getchar(); 19 while(x>='0'&&x<='9')a=a*10+x-48,x=getchar(); 20 return a; 21 } 22 int main(){ 23 n=gi(),m=gi(); 24 int s=int(sqrt(n)); 25 For(i,1,n)a[i]=gi(),pos[i]=(i-1)/s+1; 26 For(i,1,m)t[i].l=gi(),t[i].r=gi(),t[i].id=i; 27 sort(t+1,t+m+1,cmp); 28 For(i,1,m){ 29 while(l<t[i].l)change(l++,-1); 30 while(l>t[i].l)change(--l,1); 31 while(r<t[i].r)change(++r,1); 32 while(r>t[i].r)change(r--,-1); 33 if(num==t[i].r-t[i].l+1)ans[t[i].id]=1; 34 } 35 For(i,1,m)if(ans[i])printf("Yes\n");else printf("No\n"); 36 return 0; 37 }