Submission #1147229

#TimeUsernameProblemLanguageResultExecution timeMemory
1147229goduadzesabaCat Exercise (JOI23_ho_t4)C++20
100 / 100
151 ms63052 KiB
#include <bits/stdc++.h> using namespace std; #define int long long const int N=2e5+5,LOG=20,mod=1e9+7,inf=1e18; int n,p[N],rp[N],x,y,d[N],dp[N],ans[N],tin[N],tout[N],l[N][LOG],cnt; vector <int> v[N]; void dfs(int i,int p){ tin[i]=++cnt; l[i][0]=p; dp[i]=dp[p]+1; for (int j=1; j<LOG; j++) l[i][j]=l[l[i][j-1]][j-1]; for (int j:v[i]){ if (j==p) continue; dfs(j,i); } tout[i]=cnt; } bool ispar(int a,int b){ if (!a || (tin[a]<=tin[b] && tout[a]>=tout[b])) return 1; return 0; } int lca(int a,int b){ if (ispar(a,b)) return a; for (int j=LOG-1; j>=0; j--) if (!ispar(l[a][j],b)) a=l[a][j]; return l[a][0]; } int dist (int a,int b){ return dp[a]+dp[b]-2*dp[lca(a,b)]; } int par(int i){ if (i==d[i]) return i; return d[i]=par(d[i]); } void make(int a,int b){ a=par(a); b=par(b); if (a==b) return; if (p[a]<p[b]) swap(a,b); d[b]=a; } signed main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>n; for (int i=1; i<=n; i++) cin>>p[i],d[i]=i,rp[p[i]]=i; for (int i=1; i<n; i++){ cin>>x>>y; v[x].push_back(y); v[y].push_back(x); } dfs(1,0); for (int i=1; i<=n; i++){ x=rp[i]; for (int j:v[x]){ if (p[j]>i) continue; // cout << j << ' ' << i << ' ' << x << ' ' << par(j) << ' ' << dist(x, par(j)) << '\n'; ans[x]=max(ans[x],dist(x,par(j))+ans[par(j)]); make(x,j); } // cout << "ans[x] = " << ans[x] << '\n'; } cout<<ans[rp[n]]; }
#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...