此题很容易想到一个序列递增,另一个序列递减即可满足,然而这样写会一wa到底。
考虑这样一个例子:
3
1 3 2
3 1 2
答案是:0
发现这样一组例子后考虑用pair数组,先让一个序列升序,求最少交换几次能让另一个序列降序即为答案。
为了方便起见,笔者的代码是先让一个序列逆序,求最少交换几次能让另一个序列升序。
代码如下:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
pair<int,int> p[maxn];
int d[maxn];
int a[maxn];
int v[maxn];
unordered_map<int,int> mp;
int n;
int work()
{
int res=0;
for(int i=1;i<=n;i++)
a[i]=p[i].second;
for(int i=1;i<=n;i++)
d[i]=a[i];
sort(d+1,d+n+1);
for(int i=1;i<=n;i++)
mp[d[i]]=i;
for(int i=1;i<=n;i++)
{
if(!v[i])
{
int j=i;
while(!v[j])
{
v[j]=1;
j=mp[a[j]];
}
res++;
}
}
return n-res;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>p[i].first;
for(int i=1;i<=n;i++)
cin>>p[i].second;
sort(p+1,p+n+1,greater<pair<int,int>>());
cout<<work()<<endl;
return 0;
}