Submission #1038466

#TimeUsernameProblemLanguageResultExecution timeMemory
1038466SoulKnightCat Exercise (JOI23_ho_t4)C++17
41 / 100
1020 ms1048576 KiB
#include "bits/stdc++.h" using namespace std; #define ll long long #define ln '\n' const ll N = 2e5 + 5; const ll LG = 20; ll n, glit = 1, p[N], mx[LG][N], up[LG][N], where[N], sz[N]; vector<ll> adj[N]; ll dfs(ll u, ll par){ up[0][u] = par; mx[0][glit] = u; where[u] = glit++; ll tot = 1; for (auto v: adj[u]){ if (v == par) continue; tot += dfs(v, u); } sz[where[u]] = tot; return tot; } ll answer(ll l, ll r){ if (l > r) return 0; ll lg = log2(r-l+1); return p[mx[lg][l]] > p[mx[lg][r-(1<<lg)+1]]? mx[lg][l]: mx[lg][r-(1<<lg)+1]; } bool is_ancestor(ll u, ll v){ return where[u] <= where[v] && where[v] <= where[u] + sz[where[u]] - 1; } ll lca(ll u, ll v){ if (is_ancestor(u, v)) return u; if (is_ancestor(v, u)) return v; for (ll i = LG-1; i >= 0; i--){ if (!is_ancestor(up[i][u], v)) u = up[i][u]; } return up[0][u]; } ll dist(ll u, ll v){ ll ances = lca(u, v); ll ans = 0; for (ll i = LG-1; i >= 0; i--){ if (!is_ancestor(up[i][u], ances)) {ans += (1 << i); u = up[i][u];} if (!is_ancestor(up[i][v], ances)) {ans += (1 << i); v = up[i][v];} } return ans + (u != ances) + (v != ances); } ll f(ll u, ll tp, ll btm){ ll res = 0, nxt; for (auto v: adj[u]){ if (v == up[0][u]) continue; if (btm == -1) nxt = answer(where[v], where[v] + sz[where[v]] - 1); else nxt = max(answer(where[v], where[btm]-1), answer(where[btm] + sz[where[btm]], where[v] + sz[where[v]]-1), [&](ll x, ll y){return p[x] < p[y];}); if (nxt) res = max(res, dist(u, nxt) + f(nxt, v, btm)); } nxt = max(answer(where[tp], where[u] - 1), answer(where[u] + sz[where[u]], where[tp] + sz[where[tp]] - 1), [&](ll x, ll y){return p[x] < p[y];}); if (nxt) res = max(res, dist(u, nxt) + f(nxt, tp, u)); return res; } void solve(){ cin >> n; for (ll i = 1; i <= n; i++) cin >> p[i]; for (ll i = 0; i < n-1; i++){ ll u, v; cin >> u >> v; adj[u].push_back(v); adj[v].push_back(u); } ll root = -1; for (ll i = 1; i <= n; i++) if (p[i] == n) root = i; dfs(root, root); // for (ll i = 1; i <= n; i++) cout << where[i] << " "; // cout << ln; // for (ll i = 1; i <= n; i++) cout << sz[where[i]] << " "; for (ll i = 1; i < LG; i++){ for (ll j = 1; j <= n; j++) up[i][j] = up[i-1][up[i-1][j]]; for (ll j = 1; j + (1 << (i-1)) <= n; j++){ mx[i][j] = (p[mx[i-1][j]] > p[mx[i-1][j + (1 << (i-1))]])? mx[i-1][j]: mx[i-1][j + (1 << (i-1))]; } } cout << f(root, root, -1) << ln; // cout << where[1] << ' ' << where[1] + sz[where[1]] - 1 << ln; // cout << answer(where[1], where[1] + sz[1] -1) << ln; // for (ll i = 1; i <= n; i++) cout << mx[0][i] << ' '; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); // ll 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...