题目:
题意:
给出 n n n个数,以及 q q q组询问,对于 l i — r i l_i—r_i li—ri中所有数是否都是不相同的,如果是,就输出 Y e s Yes Yes,否则输出 N o No No
分析:
一个很正常的思路就是对于每个区间都去判断,但我们不妨换种思路,先预处理出对于每个位置符合条件的最右位置,然后在输入范围时就可以
O
(
1
)
O(1)
O(1)判断了
我们考虑能决定每个位置的最右位置的因素只有两个:
1.
1.
1.右边一位的最右位置
2.
\ 2.
2.往右最近一位相同的数字的位置
代码:
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<cmath>
#include<vector>
#define LL long long
using namespace std;
inline LL read() {
LL d=0,f=1;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
while(s>='0'&&s<='9'){d=d*10+s-'0';s=getchar();}
return d*f;
}
int s[100005],id[100005];
int x[100005];
int main()
{
int n=read(),q=read();
for(int i=1;i<=n;i++) x[i]=read();
id[n+1]=99999999;
for(int i=n;i;i--)
{
id[i]=min(!s[x[i]]?n:s[x[i]]-1,id[i+1]);
s[x[i]]=i;
}
while(q--)
{
int l=read(),r=read();
if(r<=id[l]) printf("Yes\n"); else printf("No\n");
}
return 0;
}