记录编号 605759 评测结果 AAAAAAAAAAAAAAAAAAAAA
题目名称 4173.[USACO25 Feb Gold]Bessie s Function 最终得分 100
用户昵称 Gravatar梦那边的美好ME 是否通过 通过
代码语言 C++ 运行时间 2.047 s
提交时间 2025-09-08 21:03:27 内存使用 19.03 MiB
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define ll long long

ll n,dp[210000][2],f[210000][2],c[210000];
bool vis[210000],now[210000];
vector<ll> out[210000],ring;
ll in[210000],ans;

void dfs(ll u){
	vis[u]=1;
	dp[u][0]=(u!=in[u])*c[u];
	for(ll v:out[u]){
		if(!now[v]&&!vis[v])
			dfs(v),dp[u][0]+=min(dp[v][0],dp[v][1]),dp[u][1]+=dp[v][0];
	}
}

ll solve(ll x){
	ring.clear();
	ll y=x;
	do{
		ring.push_back(y);
		now[y]=1,y=in[y];
	}while(y!=x);
	for(ll u:ring) dfs(u);
	ll len=ring.size();
	if(len==1) return min(dp[ring[0]][0],dp[ring[0]][1]);
	for(int i=0;i<len;i++) f[i][0]=f[i][1]=1e18;
	f[0][0]=dp[ring[0]][0];
	for(int i=1;i<len;i++){
		f[i][0]=min(f[i][0],min(f[i-1][0],f[i-1][1])+dp[ring[i]][0]),
		f[i][1]=min(f[i][1],f[i-1][0]+dp[ring[i]][1]);
	}
	ll res=min(f[len-1][0],f[len-1][1]);
	for(ll i=0;i<len;i++) f[i][0]=f[i][1]=1e18;
	f[0][0]=dp[ring[0]][0];f[0][1]=dp[ring[0]][1];
	for(int i=1;i<len;i++){
		f[i][0]=min(f[i][0],min(f[i-1][0],f[i-1][1])+dp[ring[i]][0]);
		f[i][1]=min(f[i][1],f[i-1][0]+dp[ring[i]][1]);
	}
	res=min(res,f[len-1][0]);
	return res;
}

int main(){
//	freopen("in.in","r",stdin);
	freopen("Function.in","r",stdin);
	freopen("Function.out","w",stdout);
	scanf("%lld",&n);
	for(int i=1;i<=n;i++) scanf("%lld",&in[i]),out[in[i]].push_back(i);
	for(int i=1;i<=n;i++) scanf("%lld",&c[i]);
	for(int i=1;i<=n;i++){
		if(!vis[i]){
			ll x=in[i],y=i;
			while(x!=y)	x=in[in[x]],y=in[y];
			ll tmp=solve(x);
			ans+=tmp;
		}
	}
	printf("%lld",ans);
}