#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 time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |