#include <bits/stdc++.h>
#define int long long
using namespace std;
int a;
int pos[1000005];
int t[1000005];
vector <int> z[1000005];
int par[200001][21];
int par1[1000005];
int sz[1000005];
int dp[1000005];
int high[1000005];
void dfs(int i,int parent){
for (auto p:z[i]){
if (p==parent){
continue;
}
high[p]=high[i]+1;
par[p][0]=i;
dfs(p,i);
}
}
int lca(int x,int y){
if (high[x]<high[y]){
swap(x,y);
}
for (int i=20;i>=0;i--){
if (high[par[x][i]]>=high[y]){
x=par[x][i];
}
}
if (x==y){
return x;
}
for (int i=20;i>=0;i--){
if (par[x][i]!=par[y][i] && par[x][i]){
x=par[x][i];
y=par[y][i];
}
}
return par[x][0];
}
int find(int u){
if (par1[u]==u) return u;
return par1[u]=find(par1[u]);
}
void join(int x,int y){
x=find(x);
y=find(y);
if (x==y) return;
par1[y]=x;
sz[x]+=sz[y];
}
signed main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> a;
for (int i=1;i<=a;i++){
int x;
cin >> x;
pos[x]=i;
t[i]=x;
}
for (int i=1;i<a;i++){
int x,y;
cin >> x >> y;
z[x].push_back(y);
z[y].push_back(x);
}
high[0]=-1;
dfs(1,0);
for (int j=1;j<=20;j++){
for (int i=1;i<=a;i++){
par[i][j]=par[par[i][j-1]][j-1];
}
}
for (int i=1;i<=a;i++){
par1[i]=i;
sz[i]=1;
}
for (int i=1;i<=a;i++){
int u=pos[i];
for (auto p:z[u]){
if (t[p]<t[u]){
p=find(p);
int dist=high[p]+high[u]-2*high[lca(u,p)];
dp[u]=max(dp[u],dp[p]+dist);
join(u,p);
}
}
}
cout << dp[pos[a]] << "\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... |