Submission #890979

#TimeUsernameProblemLanguageResultExecution timeMemory
890979juliany2Cat Exercise (JOI23_ho_t4)C++17
100 / 100
207 ms43120 KiB
#include<bits/stdc++.h> using namespace std; using ll = long long; #define all(x) (x).begin(), (x).end() const int N = 2e5 + 7, L = 19; int n; int p[N]; vector<int> adj[N]; int lift[N][L], dep[N], e[N]; ll dp[N]; int get(int x) { return e[x] == x ? x : e[x] = get(e[x]); } void dfs(int v = 1, int p = 0, int d = 0) { dep[v] = d; lift[v][0] = p; for (int i = 1; i < L; i++) lift[v][i] = lift[lift[v][i - 1]][i - 1]; for (int u : adj[v]) if (u != p) dfs(u, v, d + 1); } int lca(int u, int v) { if (dep[u] > dep[v]) swap(u, v); for (int i = L - 1; ~i; --i) if (dep[v] - (1 << i) >= dep[u]) v = lift[v][i]; if (u == v) return u; for (int i = L - 1; ~i; --i) if (lift[v][i] != lift[u][i]) v = lift[v][i], u = lift[u][i]; return lift[u][0]; } int dist(int u, int v) { return dep[u] + dep[v] - 2 * dep[lca(u, v)]; } int main() { cin.tie(0)->sync_with_stdio(false); cin >> n; for (int i = 1; i <= n; i++) cin >> p[i]; for (int i = 1; i < n; i++) { int u, v; cin >> u >> v; u = p[u], v = p[v]; adj[u].push_back(v); adj[v].push_back(u); } dfs(); iota(e + 1, e + n + 1, 1); for (int i = 1; i <= n; i++) { for (int u : adj[i]) { u = get(u); if (u < i) { dp[i] = max(dp[i], dp[u] + dist(i, u)); e[u] = i; } } } cout << dp[n] << '\n'; 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...