正题
题目链接:https://www.luogu.org/problem/P3901
题目大意
一个序列AAA,每次询问一个区间求这个区间的数是否各不相同。
解题思路
用lastilast_ilasti表示前一个与iii相同数的位置。
然后Lasti=max{lastj}(j<=i)Last_i=max\{last_j\}(j<=i)Lasti=max{lastj}(j<=i)表示的时选择iii为右端点时最左的左端点可以在的位置。
然后用LastrLast_rLastr判断即可。
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+100;
int n,m,last[N],Last[N],v[N];
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){int x;scanf("%d",&x);last[i]=v[x];v[x]=i;Last[i]=max(Last[i-1],last[i]); }for(int i=1;i<=m;i++){int l,r;scanf("%d%d",&l,&r);if(Last[r]<l) printf("Yes\n");else printf("No\n");}
}