#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 5005
#define mid (start+end)/2
#define pb push_back
int n,l;
int dizi[lim],dp[lim][lim];
vector<int> v[lim];
int timer,tin[lim],tout[lim],dist[lim];
int up[lim][35],ger[lim][35];
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],dizi[up[node][i]]);
}
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(!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 cev=dizi[node1];
for(int i=l;i>=0;i--){
if(!anc(up[node1][i],node2)){
cev=max(cev,ger[node1][i]);
node1=up[node1][i];
}
}
cev=max(cev,ger[node1][0]);
return cev;
}
inline int f(int node,int ata){
//cout<<node<<endl;
if(~dp[node][ata])return dp[node][ata];
int cev=0;
FOR{
if(node==i)continue;
if(dizi[i]>dizi[node])continue;
int lca=find_lca(i,node);
int distance=dist[i]+dist[node]-2*dist[lca];
int maxi=0;
maxi=max(maxi,con(i,lca));
maxi=max(maxi,con(node,lca));
//cout<<node<<" "<<i<<" "<<maxi<<" "<<dizi[node]<<" "<<distance<<endl;
if(maxi<=dizi[node]){// check
cev=max(cev,f(i,node)+distance);
}
}
return dp[node][ata]=cev;
}
int32_t main(){
faster
memset(dp,-1,sizeof(dp));
cin>>n;
l=ceil(log2(n));
int baslangic;
FOR{
cin>>dizi[i];
if(dizi[i]==n)baslangic=i;
}
FOR{
if(i==1)continue;
int x,y;cin>>x>>y;
v[x].pb(y);
v[y].pb(x);
}
dfs(1,1);
cout<<f(baslangic,0)<<'\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... |