Submission #1042879

#TimeUsernameProblemLanguageResultExecution timeMemory
1042879SoulKnightCat Exercise (JOI23_ho_t4)C++17
100 / 100
184 ms43932 KiB
#include "bits/stdc++.h" using namespace std; #define ll long long #define ln '\n' const int N = 2e5 + 5; const int LG = 20; int n, a[N], par[N], dep[N], up[LG][N]; ll dp[N]; vector<int> adj[N]; void dfs(int u, int p){ dep[u] = 1 + dep[p]; up[0][u] = p; for (int i = 1; i < LG; i++) up[i][u] = up[i-1][up[i-1][u]]; for (auto v: adj[u]){ if (v == p) continue; dfs(v, u); } } int lca(int u, int v){ if (dep[u] < dep[v]) swap(u, v); for (int i = LG-1; i >= 0; i--) if (dep[up[i][u]] >= dep[v]) u = up[i][u]; if (u == v) return u; for (int i = LG-1; i >= 0; i--){ if (up[i][u] != up[i][v]) u = up[i][u], v = up[i][v]; } return up[0][u]; } ll dist(int u, int v) {return dep[u] + dep[v] - (dep[lca(u, v)] * 2);} int find(int u) {return u == par[u]? u: par[u]=find(par[u]);} void solve(){ cin >> n; iota(par, par+n+1, 0); for (int i = 1; i <= n; i++) cin >> a[i]; for (int i = 0; i < n-1; i++){ int u, v; cin >> u >> v; u = a[u]; v = a[v]; adj[u].push_back(v); adj[v].push_back(u); } dfs(n, n); for (int i = 1; i <= n; i++){ for (auto v: adj[i]){ v = find(v); if (v < i) { par[v] = i; dp[i] = max(dp[i], dist(i, v) + dp[v]); } } } cout << dp[n] << ln; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); // int TT; cin >> TT; // while (TT--) {solve();} solve(); }
#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...