昨天ABC的E,WA两个点,求助
  • 板块学术版
  • 楼主lnwhl
  • 当前回复1
  • 已保存回复1
  • 发布时间2022/5/9 23:02
  • 上次更新2023/10/28 01:47:19
查看原帖
昨天ABC的E,WA两个点,求助
451328
lnwhl楼主2022/5/9 23:02

题目

我的思路: 先离散化一下, 然后设一个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;
}
2022/5/9 23:02
加载中...