Submission

Status:
[PPPPPPPPPP][PPPPP][PPPPPPPP][PPPPPPPPPP]

Score: 100

User: KotatsuCat

Problemset: D.Drunk

Language: cpp

Time: 0.163 second

Submitted On: 2025-01-07 22:21:13

#include<bits/stdc++.h>

using namespace std;

const int mxN = 1e6+1;
int dist1[mxN], dist2[mxN], adj[mxN], wei[mxN], deg[mxN], gp[mxN];
bool vis[mxN];

int main(){
	cin.tie(nullptr)->sync_with_stdio(false);
	int n;
	cin >> n;
	for(int i=1;i<=n;i++) cin >> wei[i];
	for(int i=1;i<=n;i++) cin >> adj[i];
	for(int i=1;i<=n;i++){
		if(i==adj[i]) continue;
		deg[adj[i]]++;
	}
	for(int i=1;i<=n;i++){
		if(vis[i] || deg[i]) continue;
		int u = i;
		while(!deg[u]){
			int v = adj[u];
			vis[u] = true;
			dist1[v]=max(dist1[v], dist1[u]+wei[u]);
			--deg[v];
			u = v;
		}
	}
	int id = 0;
	for(int i=1;i<=n;i++){
		if(vis[i]) continue;
		int u = i;
		++id;
		while(!vis[u]){
			vis[u] = true;
			gp[u]=id;
			dist2[id]+=wei[u];
			u = adj[u];
		}
	}
	int ans = 0;
	for(int i=1;i<=n;i++) ans = max(ans, dist2[gp[i]]+dist1[i]);
	cout << ans;

	return 0;
}