제출 #1314867

#제출 시각아이디문제언어결과실행 시간메모리
1314867WH8Cat Exercise (JOI23_ho_t4)C++20
100 / 100
346 ms65920 KiB
#include <bits/stdc++.h> using namespace std; #define int long long #define pll pair<long long, long long> #define mp make_pair #define pb push_back #define f first #define s second #define endl '\n' #define ld long double #define sz(x) static_cast<int>((x).size()) #define i5 tuple<int,int,int,int,int> #define all(x) x.begin(), x.end() #define iiii tuple<int, int,int,int> int p[200005]; int par(int x){ if(p[x]==0)return x; return p[x]=par(p[x]); } signed main(){ int n;cin>>n; vector<int> v(n+1), dep(n+1, 0); vector<vector<int>> al(n+1), up(n+1, vector<int>(20)); for(int i=1;i<=n;i++)cin>>v[i]; for(int i=0;i<n-1;i++){ int a,b;cin>>a>>b; al[a].pb(b); al[b].pb(a); } vector<int> ord(n); iota(all(ord), 1); sort(all(ord), [&](int a, int b){return v[a] < v[b];}); auto dfs=[&](auto && dfs, int x, int p)->void{ for(auto it:al[x]){ if(it==p)continue; dep[it]=dep[x]+1; up[it][0]=x; dfs(dfs, it, x); } }; dfs(dfs, 1, 0); for(int j=1;j<20;j++) for(int i=1;i<=n;i++) up[i][j]=up[up[i][j-1]][j-1]; auto lca=[&](int a, int b)->int{ if(dep[a] < dep[b])swap(a, b); int r=dep[a]-dep[b]; for(int i=0;i<20;i++)if((1<<i) & r) a=up[a][i]; if(a==b)return a; for(int i=19;i>=0;i--) if(up[a][i] != up[b][i])a=up[a][i], b=up[b][i]; return up[a][0]; }; auto dist=[&](int a, int b)->int{ return dep[a] + dep[b] - 2*dep[lca(a,b)]; }; // always transition to the max in the connected component. vector<int> dp(n+1, 0); for(int i : ord){ for(auto it:al[i]){ if(v[it] < v[i]){ int t=par(it); dp[i]=max(dp[i], dp[t]+dist(i, t)); p[t]=i; } } } cout<<dp[ord[n-1]]; }
#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...