Submission #1155770

#TimeUsernameProblemLanguageResultExecution timeMemory
1155770alir3za_zar3Cat Exercise (JOI23_ho_t4)C++20
100 / 100
127 ms55700 KiB
// Alir3za.Zar3 -> Shiraz , Iran #include <bits/stdc++.h> using namespace std; #define int long long const int mxN = 2e5+7 , mxL = 20; int n,P[mxN],dp[mxN]; vector<int> e[mxN]; struct LCA { int up[mxN][mxL] , o[mxN]; void Arise (int v=1 , int p=1) { o[v] = o[p]+1; up[v][0] = p; for (int bit=1; bit<mxL; bit++) up[v][bit] = up[up[v][bit-1]][bit-1]; for (auto to : e[v]) if (to != p) Arise(to , v); } int path (int u , int v) { if (o[v] < o[u]) swap(v,u); int len = o[v] - o[u]; for (int bit=0; bit<mxL; bit++) if ((1<<bit)&len) v = up[v][bit]; if (v == u) return len; for (int bit=mxL-1; bit>=0; bit--) if (up[v][bit] != up[u][bit]) { v = up[v][bit]; u = up[u][bit]; len += (1<<(1+bit)); } return 2+len; } } lca; struct DSU { int comp[mxN]; void Arise () { for (int i=1; i<=n; i++) comp[i]=i; } int root (int v) { return comp[v]==v ? v:comp[v]=root(comp[v]); } void Union (int v , int u) { v = root(v); u = root(u); dp[v] = max( dp[u]+lca.path(u,v) , dp[v] ); comp[u] = v; } } dsu; void iN () { cin >> n; for (int i=1; i<=n; i++) cin >> P[i]; for (int i=1; i<n; i++) { int u,v; cin >> u >> v; e[P[u]].push_back(P[v]); e[P[v]].push_back(P[u]); } } void ouT () { for (int v=1; v<=n; v++) for (auto to : e[ v ]) if (to < v) dsu.Union(v , to); cout << dp[n] << '\n'; } signed main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); iN (); lca.Arise (); dsu.Arise (); ouT (); }
#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...