Submission
Status:
[PPPPPPPPPP][PPPPP][PPPPPPPP][PPPPPPPPxS]
Score: 30
User: Nathlol2
Problemset: D.Drunk
Language: cpp
Time: 0.648 second
Submitted On: 2025-01-05 17:19:30
#include <bits/stdc++.h>
#define ll long long
#define pb push_back
using namespace std;
ll n;
const ll maxN = 1000005;
vector<ll> a(maxN);
vector<ll> nex(maxN);
vector<ll> root;
vector<vector<ll>> g(maxN);
vector<bool> vis(maxN, false);
ll ans = 0;
ll dfs(ll node) {
vis[node] = true;
ll mx = a[node];
for (auto i : g[node]) {
if (!vis[i]) {
mx = max(mx, a[node] + dfs(i));
}
}
return mx;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cin >> n;
for (ll i = 0; i < n; i++) {
cin >> a[i];
}
vector<ll> in(n, 0);
for (ll i = 0; i < n; i++) {
cin >> nex[i];
nex[i]--;
if (nex[i] != i) {
g[nex[i]].pb(i);
in[i]++;
}
}
for (ll i = 0; i < n; i++) {
if (in[i] == 0) {
root.pb(i);
}
}
for (auto i : root) {
if (!vis[i]) {
ans = max(ans, dfs(i));
}
}
cout << ans;
}