我的思路: 先离散化一下, 然后设一个pos数组存一下b数组里每个值的位置 定义f[i]表示a数组的1-i在b数组出现的最早位置
每次询问就判断。WA两个点,求助。
#include <bits/stdc++.h>
using namespace std;
const int maxn=2e5+5;
int n,q,a[maxn],b[maxn],cop[maxn<<1];
int pos[maxn<<1],f[maxn],numa[maxn],numb[maxn],ta[maxn<<1],tb[maxn<<1];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]),cop[i]=a[i];
for(int i=1;i<=n;i++)scanf("%d",&b[i]),cop[i+n]=b[i];
sort(cop+1,cop+n+n+1);
int cnt=unique(cop+1,cop+n+n+1)-cop-1;
for(int i=1;i<=n;i++)
{
a[i]=lower_bound(cop+1,cop+cnt+1,a[i])-cop;
numa[i]=numa[i-1];ta[a[i]]++;
if(ta[a[i]]==1)numa[i]++;
}
for(int i=1;i<=n;i++)
{
b[i]=lower_bound(cop+1,cop+cnt+1,b[i])-cop;
numb[i]=numb[i-1];tb[b[i]]++;
if(tb[b[i]]==1)numb[i]++;
if(!pos[b[i]])pos[b[i]]=i;
}
for(int i=1;i<=n;i++)
f[i]=max(f[i-1],pos[a[i]]);
scanf("%d",&q);
while(q--)
{
int x,y;scanf("%d%d",&x,&y);
if(f[x]<=y&&numa[x]==numb[y])cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}