Submission #917991

#TimeUsernameProblemLanguageResultExecution timeMemory
917991thangdz2k7Cat Exercise (JOI23_ho_t4)C++17
100 / 100
254 ms63108 KiB
#include <bits/stdc++.h> #define pb push_back #define ll long long using namespace std; const int N = 2e5 + 5; int n, p[N], par[N]; vector <int> adj[N], nw[N]; int find(int u){ if (u == par[u]) return u; return par[u] = find(par[u]); } int depth[N], to[N][20]; void dfs(int u, int pa){ for (int v : adj[u]){ if (v == pa) continue; to[v][0] = u; depth[v] = depth[u] + 1; for (int j = 1; j <= log2(depth[v] - 1); ++ j) to[v][j] = to[to[v][j - 1]][j - 1]; dfs(v, u); } } int jump(int u, int le){ for (int i = log2(le); i >= 0; -- i){ if ((le >> i) & 1) u = to[u][i]; } return u; } int lca(int u, int v){ if (depth[u] > depth[v]) swap(u, v); v = jump(v, depth[v] - depth[u]); if (u == v) return u; for (int i = log2(depth[u] - 1); i >= 0; -- i){ if (to[u][i] != to[v][i]){ u = to[u][i]; v = to[v][i]; } } return to[u][0]; } int dist(int u, int v){ return depth[u] + depth[v] - 2 * depth[lca(u, v)]; } ll calc(int u){ ll ans = 0; for (int v : nw[u]){ ans = max(ans, calc(v) + dist(u, v)); } return ans; } void solve(){ cin >> n; for (int i = 1; i <= n; ++ i) cin >> p[i]; for (int i = 1; i <= n - 1; ++ i){ int u, v; cin >> u >> v; adj[p[u]].pb(p[v]); adj[p[v]].pb(p[u]); } depth[n] = 1; dfs(n, 0); for (int i = 1; i <= n; ++ i){ par[i] = i; for (int j : adj[i]){ if (j < i){ int u = find(j); nw[i].pb(u); par[u] = i; } } } //cout << depth[5] << endl; cout << calc(n); } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); solve(); 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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...