Submission #1040236

#TimeUsernameProblemLanguageResultExecution timeMemory
1040236TAhmed33Cat Exercise (JOI23_ho_t4)C++98
100 / 100
264 ms73808 KiB
#include <bits/stdc++.h> using namespace std; #define int long long const int MAXN = 2e5 + 25; const int B = 19; typedef long long ll; int a[MAXN], n; vector <int> adj[MAXN]; struct DSU { int par[MAXN]; void init () { for (int i = 1; i <= n; i++) { par[i] = i; } } int find (int x) { return par[x] == x ? x : par[x] = find(par[x]); } void merge (int x, int y) { x = find(x); y = find(y); if (x == y) return; if (a[x] > a[y]) { par[y] = x; } else { par[x] = y; } } } cur; vector <int> adj2[MAXN]; int dp[B][MAXN], dep[MAXN]; int jump (int x, int y) { for (int i = B - 1; i >= 0; i--) { if (y & (1 << i)) { x = dp[i][x]; } } return x; } int lca (int x, int y) { if (dep[x] > dep[y]) swap(x, y); y = jump(y, dep[y] - dep[x]); if (x == y) return x ; for (int i = B - 1; i >= 0; i--) { if (dp[i][x] != dp[i][y]) { x = dp[i][x], y = dp[i][y]; } } return dp[0][x]; } ll dist (int x, int y) { return dep[x] + dep[y] - 2 * dep[lca(x, y)]; } ll dfs (int pos) { if (adj2[pos].empty()) return 0; ll mx = 0; for (auto j : adj2[pos]) { mx = max(mx, dist(j, pos) + dfs(j)); } return mx; } void dfs2 (int pos, int par) { for (auto j : adj[pos]) { if (j != par) { dp[0][j] = pos; for (int i = 1; i < B; i++) { dp[i][j] = dp[i - 1][dp[i - 1][j]]; } dep[j] = 1 + dep[pos]; dfs2(j, pos); } } } void solve () { cin >> n; for (int i = 1; i <= n; i++) { cin >> a[i]; } for (int i = 1; i < n; i++) { int x, y; cin >> x >> y; adj[x].push_back(y); adj[y].push_back(x); } dfs2(1, 0); vector <int> ii; for (int i = 1; i <= n; i++) { ii.push_back(i); } sort(ii.begin(), ii.end(), [&] (int x, int y) { return a[x] < a[y]; }); cur.init(); for (auto i : ii) { for (auto j : adj[i]) { if (a[j] > a[i]) { continue; } adj2[i].push_back(cur.find(j)); cur.merge(i, cur.find(j)); } } int root = -1; for (int i = 1; i <= n; i++) { if (a[i] == n) { root = i; } } cout << dfs(root) << '\n'; } signed main () { ios::sync_with_stdio(0); cin.tie(0); int tc = 1; //cin >> tc; while (tc--) 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...