显示代码纯文本
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
struct node{
int value, next;
}a[1000002];
bool cmp(const node&a,const node&b)
{
return a.value<b.value;
}
bool flag[1000002];
int n,cnt;
long long ans;
int main()
{
freopen("ghost.in","r",stdin);
freopen("ghost.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i].value);
for(int i=1;i<=n;i++)scanf("%d",&a[i].next);
for(int i=1;i<=n;i++)
if(a[i].value!=a[i].next)
ans+=a[i].value;
else
flag[i]=true;
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++)if(a[i].value!=i)cout<<"E";
for(int i=1;i<=n;i++)if(!flag[i])
{
cnt=0;
for(int k=i;!flag[k];k=a[k].next){
cnt++, flag[k]=true; //cout << k <<' ' ;
}
// cout<<endl;
ans+=(long long)(cnt-2)*i;
}
cout<<ans<<endl;
// system("pause");
while(1);
return 0;
}
//12504665