Submission #1158492

#TimeUsernameProblemLanguageResultExecution timeMemory
1158492ReLiceCat Exercise (JOI23_ho_t4)C++20
100 / 100
166 ms75016 KiB
#include <bits/stdc++.h> #define ll long long #define ld double #define pb push_back #define pf push_front #define ins insert #define fr first #define sc second #define endl "\n" #define ar array #define all(x) x.begin(), x.end() #define rall(x) x.rbegin(), x.rend() using namespace std; void start(){ios_base::sync_with_stdio(NULL);cin.tie(nullptr);cout.tie(nullptr);} const ll inf = 1e17; const ll mod = 1e9 + 7; const ll N = 2e5 + 8; vector<vector<ll>> g(N), ng(N); ll siz[N], p[N], mx[N]; ll up[N][20], d[N]; ll anc(ll a){ return (p[a] == a ? a : anc(p[a])); } bool uni(ll a, ll b){ a = anc(a), b = anc(b); if(a == b) return false; if(siz[a] > siz[b]) swap(a, b); p[a] = b; siz[b] += siz[a]; mx[b] = max(mx[a], mx[b]); return true; } void dfs(ll v){ for(ll i=1;i<=19;i++) up[v][i] = up[up[v][i - 1]][i - 1]; for(auto i : g[v]){ if(i == up[v][0]) continue; d[i] = d[v] + 1; up[i][0] = v; dfs(i); } } ll lca(ll a, ll b){ if(d[a] < d[b]) swap(a, b); for(ll i=19;i>=0;i--){ if(d[a] - d[b] >= (1<<i)){ a = up[a][i]; } } if(a == b) return a; for(ll i=19;i>=0;i--){ if(up[a][i] != up[b][i]){ a = up[a][i]; b = up[b][i]; } } return up[a][0]; } ll dis(ll a, ll b){ return d[a] + d[b] - 2 * d[lca(a, b)]; } void solve() { ll i, j; ll n; cin>>n; ll v[n + 1]; for(i=1;i<=n;i++) { cin>>v[i]; p[i] = i; siz[i] = 1; mx[i] = i; } for(i=1;i<n;i++){ ll a, b; cin>>a>>b; a = v[a]; b = v[b]; g[a].pb(b); g[b].pb(a); } for(i=1;i<=n;i++){ for(auto to : g[i]){ if(to < i){ ng[i].pb(mx[anc(to)]); //cout<<i<<' '<<mx[anc(to)]<<endl; uni(i, to); } } } d[1] = 0; up[1][0] = 1; dfs(1); vector<ll> ans(n + 1, 0); ll mx = 0; for(i=n;i>0;i--){ mx = max(mx, ans[i]); //cout<<ans[i]<<endl; for(auto to : ng[i]){ //cout<<i<<' '<<to<<' '<<dis(to, i)<<endl; ans[to] = ans[i] + dis(to, i); } } cout<<mx<<endl; } signed main(){ start(); ll t = 1; //cin>>t; while(t--) 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...