Submission #1040233

#TimeUsernameProblemLanguageResultExecution timeMemory
1040233TAhmed33Cat Exercise (JOI23_ho_t4)C++98
41 / 100
113 ms70108 KiB
#include <bits/stdc++.h> using namespace std; #pragma GCC optimize ("trapv") const int MAXN = 2e5 + 25; const int B = 20; typedef long long ll; int a[MAXN], n; vector <int> adj[MAXN]; int inv[MAXN]; ll dp[B][MAXN], dep[MAXN]; ll ans[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; 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][x]; } } return dp[0][x]; } ll dist (int x, int y) { return dep[x] + dep[y] - 2 * dep[lca(x, y)]; } 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]; inv[a[i]] = 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); cur.init(); for (int x = 1; x <= n; x++) { int i = inv[x]; for (auto j : adj[i]) { if (a[j] > a[i]) { continue; } ans[i] = max(ans[i], ans[cur.find(j)] + dist(cur.find(j), i)); cur.merge(i, cur.find(j)); } } cout << ans[inv[n]] << '\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...