#题目分析
题目要求求解最少修改次数,我们可以发现给的A和B数组都是一个排列,也就是说具有唯一性,我们可以根据B数组的元素出现顺序给A数组里面元素排个序,最后求解最长上升子序列就行。
题目样例
B 1 2 4 3 5 6
顺序 1 2 3 4 5 6
根据B数组可得
A 6 1 2 3 4 5
顺序 6 1 2 4 3 5
用p数组表示
最后求p数组的最长上升子序列,在拿n-最长上升子序列 code:
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
typedef long long ll;
const int N=1e6+10,M=200,mod=1e9+7;
const int INF=0x3f3f3f3f;
typedef pair<ll,ll>pii;
int T;
int n;
int f[N];
int a[N],b[N],vis[N],p[N],q[N];
void solve()
{
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++)cin>>b[i];
for(int i=1;i<=n;i++)vis[b[i]]=i;
for(int i=1;i<=n;i++)p[i]=vis[a[i]];
q[1]=p[1];int cnt=1;
for(int i=1;i<=n;i++)
{
int l=1,r=cnt;
while(l<=r)
{
int mid=l+r>>1;
if(q[mid]>=p[i])r=mid-1;
else l=mid+1;
}
if(r+1>cnt){cnt++;q[cnt]=p[i];}
else q[r+1]=p[i];
}
cout<<n-cnt<<'\n';
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr),cout.tie(nullptr);
T=1;
//cin>>T;
while(T--)solve();
return 0;
}