分析:
开始没有思路,后来发现只需要找出一对好的就行了,那么当数组本身就是好的时,操作数为0,如果不符合可以是他变成好的的方法有两种:
1.不断交换使pos(a[i])>pos(a[i+1])。
2. 使pos(a[i])和pos(a[i+1])之间的距离足够大大于d。
第二种需要先判断长度能不能满足才行。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N=1e5+10;
int a[N];
int p[N];
int pos[N];
void solve()
{
int n,m,d;
cin>>n>>m>>d;
for(int i=1;i<=n;i++)
{
cin>>p[i];
pos[p[i]]=i;
}
for(int i=1;i<=m;i++) cin>>a[i];
int ans=0x3f3f3f3f;
for(int i=1;i<m;i++)
{
if((pos[a[i]]>=pos[a[i+1]])||(pos[a[i+1]]>pos[a[i]]+d))
{
ans=0;
break;
}
int dis=pos[a[i+1]]-pos[a[i]];
ans=min(ans,dis);
int x=d-dis+1;
int ok=pos[a[i]]-1+n-pos[a[i+1]];
if(ok>=x) ans=min(ans,x);
}
cout<<ans<<'\n';
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int T;
cin>>T;
while(T--)
{
solve();
}
return 0;
}