90分求助
查看原帖
90分求助
299419
nixun楼主2024/3/16 18:08

思路大概是将每个数字出现的下标保存,并且保存每个位置对应在查询表中的下标,应该是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;
}
2024/3/16 18:08
加载中...