Pagini recente » Cod sursa (job #2870581) | Cod sursa (job #1824621) | Cod sursa (job #2429644) | Cod sursa (job #2177164) | Cod sursa (job #1236973)
#include <iostream>
#include <cstdio>
#define in "biperm.in","r",stdin
#define out "biperm.out","w",stdout
#include <vector>
#define nmax 10009
using namespace std;
int n,A[3][nmax],viz[nmax],nr,vi[nmax],vf[nmax],nri,nrf,nrt;
vector<int>G[nmax],d[nmax],aux[nmax],aux1[nmax],ad[nmax],ag[nmax],add[nmax],agg[nmax];
void Going(int k,int q){
int x,y,i,j;
x = G[k][q];
for(i=1;i<=n;i++)
vi[A[1][i]]=0;
if(d[x][0]==k&&d[x].size()==2)
d[x][0]=d[x][1];
d[x].pop_back();
nri=0;
cout << k <<' '<<x<<' ';
vi[k]=vi[x]=1;
while(x!=k){
if(!G[x].size()){
nri++;
y=x;
x=d[x][0];
if(G[x][0]==y&&G[x].size()==2)
G[x][0]=G[x][1];
G[x].pop_back();
}
else{ y=x;
x = G[x][0];
if(d[x][0]==y&&d[x].size()==2)
d[x][0]=d[x][1];
d[x].pop_back();
}
cout << x <<' ';
vi[x]=1;
viz[x]=1;
}
cout << nri<<'\n';
// nr+=nri;
}
void Going2(int k,int q){
int x,y,i,j;
x = ag[k][q];
if(d[x][0]==k&&ad[x].size()==2)
ad[x][0]=ad[x][1];
ad[x].pop_back();
nrf=0;
// cout << k <<' '<<x<<' ';
while(x!=k){
if(!ag[x].size()){
nrf++;
y=x;
x=ad[x][0];
if(ag[x][0]==y&&ag[x].size()==2)
ag[x][0]=ag[x][1];
ag[x].pop_back();
}
else{ y=x;
x = ag[x][0];
if(ad[x][0]==y&&ad[x].size()==2)
ad[x][0]=ad[x][1];
ad[x].pop_back();
}
//cout << x <<' ';
}
// cout << nri<<'\n';
//nr+=nri;
}
int main(){
int i,j,x,ii,p,y;
freopen(in);
freopen(out);
scanf("%d",&n);
for(i=1;i<=2;i++)
for(j=1;j<=n;j++)
scanf("%d",&A[i][j]);
for(i=1;i<=n;i++){
G[A[1][i]].push_back(A[2][i]);
d[A[2][i]].push_back(A[1][i]);
ag[A[1][i]].push_back(A[2][i]);
ad[A[2][i]].push_back(A[1][i]);
}
p=0;
for(i=1;i<=n;i++){
if(!viz[A[1][i]]){
if(G[A[1][i]].size()==1){
Going(A[1][i],0);
// for(j=1;j<=n;j++)
// viz[A[1][j]]=vi[A[1][j]];
nrt+=nri;
}
else if(G[A[1][i]].size()==2){
Going(A[1][i],0);
Going2(A[1][i],1);
nrt=nrt+min(nri,nrf);
}
}
}
// cout << G[18][1]<<' ';
// Going(1,0);
// Going(5,0);
// Going(2,0);
// Going(3,0);
//cout << nrt;
return 0;
}