#include <bits/stdc++.h>
using namespace std;
#define int long long
#define faster ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define FOR for(int i=1;i<=n;i++)
#define lim 200005
#define mid (start+end)/2
#define pb push_back
int n,l,ans;
int dizi[lim],mp[lim];
vector<int> v[lim];
int timer,tin[lim],tout[lim],dist[lim];
int up[lim][35],ger[lim][35];
int par[lim],sz[lim],buy[lim],cev[lim];
inline void dfs(int node,int ata){
tin[node]=tout[node]=++timer;
dist[node]=dist[ata]+1;
up[node][0]=ata;
ger[node][0]=dizi[ata];
for(int i=1;i<=l;i++){
up[node][i]=up[up[node][i-1]][i-1];
ger[node][i]=max(ger[node][i-1],ger[up[node][i-1]][i-1]);
}
for(auto go:v[node]){
if(go==ata)continue;
dfs(go,node);
tout[node]=max(tout[node],tout[go]);
}
}
inline bool anc(int node1,int node2){
return tin[node1]<=tin[node2] && tout[node1]>=tout[node2];
}
inline int find_lca(int node1,int node2){
if(anc(node1,node2))return node1;
if(anc(node2,node1))return node2;
for(int i=l;i>=0;i--){
if(up[node1][i]!=0 && (!anc(up[node1][i],node2)))node1=up[node1][i];
}
return up[node1][0];
}
inline int con(int node1,int node2){
if(node1==node2)return dizi[node1];
int cevv=dizi[node1];
for(int i=l;i>=0;i--){
if(up[node1][i]!=0 && (!anc(up[node1][i],node2))){
cevv=max(cevv,ger[node1][i]);
node1=up[node1][i];
}
}
cevv=max(cevv,ger[node1][0]);
return cevv;
}
inline int find(int node){
if(node==par[node])return node;
return par[node]=find(par[node]);
}
inline void uni(int node1,int node2){
node1=find(node1);
node2=find(node2);
if(node1==node2)return ;
// cout<<node1<<" "<<node2<<endl;
int lca=find_lca(buy[node1],buy[node2]);
int distance=dist[buy[node1]]+dist[buy[node2]]-2*dist[lca];
// if(sz[node1]<sz[node2])swap(node1,node2);
if(dizi[buy[node1]]<dizi[buy[node2]])buy[node1]=buy[node2];
cev[node1]=max(cev[node1],cev[node2]+distance);
par[node2]=node1;
sz[node1]+=sz[node2];
}
int32_t main(){
faster
cin>>n;
l=ceil(log2(n));
FOR{
cin>>dizi[i];
mp[dizi[i]]=i;
par[i]=i;
sz[i]=1;
buy[i]=dizi[i];
}
FOR{
if(i==1)continue;
int x,y;cin>>x>>y;
v[x].pb(y);
v[y].pb(x);
}
dfs(1,0);
FOR{
int node=mp[i];
for(auto go:v[node]){
if(dizi[go]<i){
uni(go,node);
}
}
}
//cout<<ans<<'\n';
cout<<cev[find(n)]<<'\n';
return 0;
}
# | 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... |