Submission #1229532

#TimeUsernameProblemLanguageResultExecution timeMemory
1229532papauloForensic (NOI12_forensic)C++20
25 / 25
6 ms2632 KiB
#include <bits/stdc++.h>
using namespace std;

#define MAXN 20200
int breadth[MAXN];
vector<int> rev[MAXN];
vector<int> finals;
int arr[MAXN];
int visited[MAXN];
set<pair<int, int>> st;

void dfs(int v) {
    auto p=st.find({breadth[v], v});
    if(p==st.end()) return;
    st.erase(p);
    for(auto u : rev[v]) {
        dfs(u);
    }
}

int main() {
    int n;
    cin >> n;
    for(int i=0;i<n;i++) {
        cin >> arr[i];
        if(arr[i]<0) finals.push_back(i);
        else rev[arr[i]].push_back(i);
    }
    for(int i=0;i<n;i++) breadth[i]=-1;
    queue<int> q;
    for(auto v : finals) {
        breadth[v]=1;
        q.push(v);
    }
    while(!q.empty()) {
        int v=q.front();
        q.pop();
        for(auto u : rev[v]) {
            if(breadth[u]>=0) continue;
            breadth[u]=breadth[v]+1;
            q.push(u);
        }
    }
    st.insert({0, -1});
    for(int i=0;i<n;i++) st.insert({breadth[i], i});
    int v=0;
    int cur=0;
    int ans=0;
    memset(visited, 0, sizeof(visited));
    while(v!=-1&&!visited[v]) {
        visited[v]=1;
        dfs(v);
        cur++;
        auto p=st.end();
        p--;
        ans=max(ans, cur+p->first);
        v=arr[v];
    }
    cout << ans << endl;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...