제출 #906506

#제출 시각아이디문제언어결과실행 시간메모리
906506NonozeCat Exercise (JOI23_ho_t4)C++17
100 / 100
628 ms88792 KiB
#include <bits/stdc++.h> using namespace std; #define int long long int n; vector<int> parent; vector<bool> already; vector<vector<int>> adj; vector<int> vaut; vector<vector<int>> adjbase; vector<int> depth; vector<vector<int>> up; //LCA int get_lca(int a, int b) { if (depth[a] < depth[b]) swap(a, b); int k=depth[a]-depth[b]; for (int j=19; j>=0; j--) { if (k & (1<<j)) { a=up[a][j]; } } if (a==b) return a; for (int j=19; j>=0; j--) { if (up[a][j]!=up[b][j]) { a=up[a][j]; b=up[b][j]; } } return up[a][0]; } //UNION FIND int getparent(int x) { if (x==parent[x]) return x; return parent[x]=getparent(parent[x]); } bool same(int a, int b) { return (getparent(a)==getparent(b)); } void unite(int a, int b) { if (!already[a]) return; a=getparent(a); b=getparent(b); parent[a]=b; adj[b].push_back(a); } //INIT void initdfs(int s, int last=-1) { for (auto u: adjbase[s]) { if (u==last) continue; depth[u] = depth[s]+1; up[u][0]=s; for (int i=1; i<20; i++) { up[u][i]=up[ up[u][i-1] ][i-1]; } initdfs(u, s); } } //ANS CALCULATION int calcans(int s) { int ans=0; for (auto u: adj[s]) { int add=depth[u]+depth[s]-2LL*depth[get_lca(u, s)]; ans=max(ans, calcans(u)+add); } return ans; } void solve() { cin >> n; adj.resize(n+1); already.resize(n+1, false); adjbase.resize(n+1); vaut.resize(n+1); parent.resize(n+1); depth.resize(n+1); up.resize(n+1, vector<int>(20)); priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq; for (int i=0; i<n; i++) { parent[i]=i; } for (int i=0; i<n; i++) { int u; cin >> u; pq.push({u, i}); } for (int i=0; i<n-1; i++) { int u, v; cin >> u >> v; u--, v--; adjbase[u].push_back(v); adjbase[v].push_back(u); } initdfs(0); int last=0; while (!pq.empty()) { int s=pq.top().second; pq.pop(); last=s; for (auto u: adjbase[s]) { unite(u, s); } already[s]=true; } cout << calcans(last) << endl; return; } signed main() { ios::sync_with_stdio(0); cin.tie(0); solve(); 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...