题意:
解法:
如果某个人一开始就拿的不是自己的包,同时不能交换,那么肯定无解.
否则一定有解:
根据置换的性质,可以将置换序列抽象成若干个有向环,
我们只需要取出有向环中重量最大的人,让这个人作为传递员,交换一圈过去就行了.
code:
#include <bits/stdc++.h>
using namespace std;
#define PI pair<int,int>
const int maxm=2e5+5;
int mark[maxm];
int a[maxm];
int b[maxm];
int p[maxm];
int n;
vector<PI>ans;
signed main(){
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++){
cin>>p[i];
if(p[i]!=i&&b[p[i]]>=a[i]){
return cout<<-1<<endl,0;
}
}
for(int i=1;i<=n;i++){
if(!mark[i]){
vector<int>temp;
int x=i;
while(!mark[x]){
mark[x]=1;
x=p[x];
temp.push_back(x);
}
int ma=0;
for(int j=0;j<temp.size();j++){
if(a[temp[j]]>a[temp[ma]]){
ma=j;
}
}
for(int j=temp[ma];p[j]!=temp[ma];j=p[j]){
ans.push_back({
temp[ma],p[j]});
}
}
}
cout<<ans.size()<<endl;
for(auto i:ans){
cout<<i.first<<' '<<i.second<<endl;
}
return 0;
}