思路大概是将每个数字出现的下标保存,并且保存每个位置对应在查询表中的下标,应该是O(n)级别的, 但是最后一个算例TLE了
#include<iostream>
#include<vector>
using namespace std;
vector<vector<int>>table(100005);//查询表,表头为数字,后续数组为对应的数列下标位置
vector<int>arr(100005);//存储数列
vector<int>loc(100005);//存储查询表下标
int main(void)
{
int n,q;
cin>>n>>q;
for(int i=0;i<n;i++)
{
int tmp;
cin>>tmp;
arr[i]=tmp;
loc[i]=table[tmp].size();
table[tmp].push_back(i);
}
for(int i=0;i<q;i++)
{
int left,right;
cin>>left>>right;
int flag=0;
//查询到位置,然后检测右值是否越界
for(int j=left-1;j<right;j++)
{
if(table[arr[j]].size()==1)continue;
else
{
//找到下标
if(loc[j]+1<table[arr[j]].size())
{
if(table[arr[j]][loc[j]+1]<right)
{
flag=1;
break;
}
}
else
continue;
}
}
if(flag==0)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
return 0;
}