Submission

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

Score: 100

User: Nathlol2

Problemset: D.Drunk

Language: cpp

Time: 0.659 second

Submitted On: 2025-01-05 19:58:06

#include <bits/stdc++.h>
#define ll long long
#define ld long double
#define pb push_back
using namespace std;

int n;
const int maxN = 1000005;
vector<int> a(maxN);
vector<int> root;
vector<vector<int>> g(maxN);
vector<bool> vis(maxN, false);
ll ans = 0;

ll dfs(int 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 (int i = 0; i < n; i++) {
        cin >> a[i];
    }
    int el;
    for (int i = 0; i < n; i++) {
        cin >> el;
        el--;
        if (el != i) {
            g[el].pb(i);
        } else {
            root.pb(i);
        }
    }
    for (auto i : root) {
        if (!vis[i]) {
            ans = max(ans, dfs(i));
        }
    }
    
    cout << ans;
}