最难的一题。到现在也不是很明白。
先用原来数组a,i和x来记录每个索引所对应的值
然后用输入b数组找到原来位置的索引。当索引满足pos(ai)<pos(ai+1)≤pos(ai)+d时候,分情况进行讨论:
如果交换两个值得到答案,则后续无法满足后续存在的解。则满足的解是将其向前后移并且分开,但是最终解是否成立还不能够证明,只知道这样的思维。
#include<bits/stdc++.h>
using namespace std;
int t,m,n,d,a[200010],b[200010];
int main()
{
cin>>t;
while(t--)
{
cin>>n>>m>>d;
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
a[x]=i;
}
for(int i=1;i<=m;i++)
{
cin>>b[i];
}
int pre=b[1];
int ans=1e9;
for(int i=2;i<=m;i++)
{
int temp=0;
if(a[pre]<a[b[i]]&&a[b[i]]<=min(n,a[pre]+d))
{
if(a[b[i]]-a[pre]<=d-(a[b[i]]-a[pre])+1||d-(a[b[i]]-a[pre])+1>n-a[b[i]]+a[pre]-1)
{
temp=a[b[i]]-a[pre];
}
else{
temp=a[pre]+d-a[b[i]]+1;
}
}
ans=min(ans,temp);
pre=b[i];
}
cout<<ans<<endl;
}
return 0;
}