比赛 20120723 评测结果 AAAAAAAAAA
题目名称 电脑幽魂 最终得分 100
用户昵称 了反取字名我擦 运行时间 2.493 s
代码语言 C++ 内存使用 47.05 MiB
提交时间 2012-07-23 12:52:26
显示代码纯文本
#include<fstream>
#include<sstream>
#include<algorithm>
#include<cmath>
#include<string>
#include<list>
#include<vector>
#include<deque>
#include<queue>
#include<map>

using namespace std;
ifstream fi("ghost.in");
ofstream fo("ghost.out");

long long n,a[1000001],b[1000001],ai[1000001],circle[1000001],mi[1000001],p=0,m=999999999,size[1000001];
bool fg[1000001];
int main()
{
	long long ans=0;
	int k;
	fi>>n;
	for(int i=1;i<=n;i++)
	{
		fi>>a[i];
		ai[a[i]]=i;
		mi[i]=999999999;
	}
	for(int i=1;i<=n;i++)
		fi>>b[i];
	for(int i=1;i<=n;i++)
	{
		k=a[i];
		if(!fg[k])
			p++;
		while(!fg[k])
		{
			if(a[k]<mi[p])
				mi[p]=a[k];
			size[p]++;
			fg[k]=1;
			circle[p]+=a[k];
			k=ai[b[k]];
		}
	}
	for(int i=1;i<=n;i++)
		if(a[i]<m)
			m=a[i];
	for(int i=1;i<=p;i++)
		ans+=min(circle[i]+mi[i]*(size[i]-2),m+mi[i]+circle[i]+m*size[i]);
	fo<<ans;
	fi.close();
	fo.close();
	return 0;
}