Submission #1271211

#TimeUsernameProblemLanguageResultExecution timeMemory
1271211goulthenCat Exercise (JOI23_ho_t4)C++20
100 / 100
285 ms80276 KiB
#include <bits/stdc++.h> using namespace std; #define int long long #define ll long long #define rep(i,a,b) for (int i = a; i <= b; i++) #define per(i,a,b) for (int i = a; i >= b; i--) #define fi first #define se second #define pii pair<int,int> #define pb push_back const int MAXN = 2e5+10; const int INF = 1e18 + 5; vector<int> g[MAXN]; int a[MAXN],rp[MAXN],sz[MAXN], mx[MAXN], inv[MAXN], val[MAXN], dep[MAXN], anc[MAXN][31]; int find(int x) { if (rp[x] == x) return x; return rp[x] = find(rp[x]); } void join(int x, int y) { x = find(x), y = find(y); if (x==y)return; if (sz[x] > sz[y]) swap(x,y); rp[x] = y; if(a[mx[y]] < a[mx[x]]) mx[y] = mx[x]; sz[y] += sz[x]; } void dfs(int u, int p = 1) { anc[u][0] = p; for (int &v : g[u]) { if (v==p) continue; dep[v] = dep[u] + 1; dfs(v,u); } } int getu(int u, int jmp) { int ans = u, cur = 0; while (jmp > 0) { if (jmp&1) ans = anc[ans][cur]; cur++; jmp/=2; } return ans; } int dist(int u, int v) { if (dep[u] < dep[v]) swap(u,v); int lu = u, lv = v; lu = getu(lu,dep[u]-dep[v]); per(k,30,0) { if (anc[lu][k] != anc[lv][k]) { lu = anc[lu][k]; lv = anc[lv][k]; } } if(lu!=lv) lu = anc[lu][0]; return dep[u] + dep[v] - 2*dep[lu]; } int32_t main() { ios_base::sync_with_stdio(0); cin.tie(nullptr); int n; cin >> n; rep(i,1,n) { cin >> a[i]; inv[a[i]] = i; } rep(i,1,n) rp[i] = i, sz[i] = 1, mx[i] = i; rep(i,1,n-1) { int u,v;cin >> u >> v; g[u].pb(v); g[v].pb(u); } dfs(1); rep(k,1,30) { rep(i,1,n) { anc[i][k] = anc[anc[i][k-1]][k-1]; } } rep(i,1,n) { int x = inv[i]; for (int &v : g[x]) { if (a[v] > i) continue; val[x] = max(val[x], dist(x,mx[find(v)]) + val[mx[find(v)]]); join(x,v); } } cout << val[inv[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...