此題很容易想到一個序列遞增,另一個序列遞減即可滿足,然而這樣寫會一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;
}