显示代码纯文本
#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(!flag[i])
{
cnt=0;
for(int k=i;!flag[k];k=a[k].next)
cnt++, flag[k]=true;
ans+=(long long)(cnt-2)*i;
}
cout<<ans<<endl;
// system("pause");
return 0;
}