// Alir3za.Zar3 -> Shiraz , Iran
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int mxN = 2e5+7 , mxL = 20;
int n,P[mxN],dp[mxN];
vector<int> e[mxN];
struct LCA
{
int up[mxN][mxL] , o[mxN];
void Arise (int v=1 , int p=1)
{
o[v] = o[p]+1; up[v][0] = p;
for (int bit=1; bit<mxL; bit++)
up[v][bit] = up[up[v][bit-1]][bit-1];
for (auto to : e[v])
if (to != p) Arise(to , v);
}
int path (int u , int v)
{
if (o[v] < o[u]) swap(v,u);
int len = o[v] - o[u];
for (int bit=0; bit<mxL; bit++)
if ((1<<bit)&len) v = up[v][bit];
if (v == u) return len;
for (int bit=mxL-1; bit>=0; bit--)
if (up[v][bit] != up[u][bit])
{
v = up[v][bit];
u = up[u][bit];
len += (1<<(1+bit));
}
return 2+len;
}
} lca;
struct DSU
{
int comp[mxN];
void Arise ()
{
for (int i=1; i<=n; i++)
comp[i]=i;
}
int root (int v)
{ return comp[v]==v ? v:comp[v]=root(comp[v]); }
void Union (int v , int u)
{
v = root(v); u = root(u);
dp[v] = max( dp[u]+lca.path(u,v) , dp[v] );
comp[u] = v;
}
} dsu;
void iN ()
{
cin >> n;
for (int i=1; i<=n; i++)
cin >> P[i];
for (int i=1; i<n; i++)
{
int u,v; cin >> u >> v;
e[P[u]].push_back(P[v]);
e[P[v]].push_back(P[u]);
}
}
void ouT ()
{
for (int v=1; v<=n; v++)
for (auto to : e[ v ])
if (to < v) dsu.Union(v , to);
cout << dp[n] << '\n';
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
iN ();
lca.Arise ();
dsu.Arise ();
ouT ();
}
# | 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... |