Submission #1260487

#TimeUsernameProblemLanguageResultExecution timeMemory
1260487vlomaczkCat Exercise (JOI23_ho_t4)C++20
31 / 100
2097 ms50548 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> typedef long long ll; using namespace __gnu_pbds; using namespace std; template <typename T> using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; int M = 200'010; int maxlog = 17; vector<vector<int>> g(M); vector<int> p(M), h(M), is_off(M), depth(M); vector<vector<int>> jump(M, vector<int>(maxlog+1)); int find_max(int v, int p) { int ans = v; for(auto u : g[v]) { if(u==p || is_off[u]) continue; int fm = find_max(u, v); if(h[fm] > h[ans]) ans = fm; } return ans; } void jump_dfs(int v, int p) { depth[v] = depth[p] + 1; jump[v][0] = p; for(int i=1; i<=maxlog; ++i) jump[v][i] = jump[jump[v][i-1]][i-1]; for(auto u : g[v]) if(u!=p) jump_dfs(u, v); } int lca(int a, int b) { if(depth[b] > depth[a]) swap(a, b); for(int i=maxlog; i>=0; --i) { if(depth[jump[a][i]] >= depth[b]) a = jump[a][i]; } if(a==b) return a; for(int i=maxlog; i>=0; --i) { if(jump[a][i]!=jump[b][i]) { a = jump[a][i]; b = jump[b][i]; } } return jump[a][0]; } int dist(int a, int b) { return depth[a] + depth[b] - 2*depth[lca(a, b)]; } int ans(int v) { int odp = 0; is_off[v] = 1; for(auto u : g[v]) { if(is_off[u]) continue; int fm = find_max(u, v); odp = max(odp, dist(v, fm)+ans(fm)); } return odp; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n; cin >> n; for(int i=1; i<=n; ++i) { cin >> h[i]; p[h[i]] = i; } for(int i=1; i<n; ++i) { int a, b; cin >> a >> b; g[a].push_back(b); g[b].push_back(a); } jump_dfs(1, 0); cout << ans(p[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...