Submission #930464

#TimeUsernameProblemLanguageResultExecution timeMemory
930464Darren0724Cat Exercise (JOI23_ho_t4)C++17
54 / 100
198 ms39276 KiB
#include <bits/stdc++.h> using namespace std; #define LCBorz ios_base::sync_with_stdio(false); cin.tie(0); #define all(x) x.begin(), x.end() const int N=200005; const int K=20; vector<int> pa(N); int Find(int k){ return (pa[k]==k?k:pa[k]=Find(pa[k])); } void onion(int a,int b){ a=Find(a),b=Find(b); if(a!=b)pa[a]=b; } int32_t main() { LCBorz; iota(all(pa),0); int n;cin>>n; vector<int> v(N),v1(N),dp(N),adj[N],dis(N); vector jump(K,vector(N,0)); for(int i=1;i<=n;i++){ cin>>v[i]; v1[v[i]]=i; } for(int i=1;i<n;i++){ int a,b;cin>>a>>b; adj[a].push_back(b); adj[b].push_back(a); } auto dfs=[&](auto dfs1,int k)->void { for(int i=1;i<K;i++){ jump[i][k]=jump[i-1][jump[i-1][k]]; } for(int j:adj[k]){ if(j==jump[0][k])continue; jump[0][j]=k; dis[j]=dis[k]+1; dfs1(dfs1,j); } }; auto lca=[&](int a,int b)->int { if(dis[a]<dis[b])swap(a,b); int d=dis[a]-dis[b]; for(int i=K-1;i>=0;i--){ if(d&(1<<i)){ a=jump[i][a]; } } if(a==b)return a; for(int i=K-1;i>=0;i--){ if(jump[i][a]!=jump[i][b]){ a=jump[i][a],b=jump[i][b]; } } return jump[0][a]; }; auto far=[&](int a,int b){ return dis[a]+dis[b]-2*dis[lca(a,b)]; }; jump[0][1]=1; dfs(dfs,1); for(int i1=1;i1<=n;i1++){ int i=v1[i1]; for(int j:adj[i]){ if(v[j]>v[i])continue; dp[i]=max(dp[i],dp[Find(j)]+far(i,Find(j))); onion(Find(j),i); } } cout<<dp[v1[n]]<<endl; 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...