This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pll;
#define fastio ios::sync_with_stdio(false), cin.tie(0)
#define FOR(i, a, b) for(int i = (a); i < (b); i++)
#define REP(i, n) FOR(i, 0, n)
#define ALL(x) (x).begin(), (x).end()
#define pb push_back
#define eb emplace_back
#define f first
#define s second
const int INF = 1e9;
const int maxn = 2e5 + 5;
vector<int> adj[maxn];
int h[maxn], id[maxn], n;
vector<pll> edge;
int dep[maxn], par[maxn], succ[maxn][18];
struct DSU{
vector<int> par, siz;
int n;
DSU(int _n) : n(_n){
par.resize(n);
for(int i = 0; i < n; i++) par[i] = i;
}
int root(int x){ return x == par[x] ? x : par[x] = root(par[x]);}
void unite(int x, int y){
y = root(y); // h[x] > h[y]
par[y] = x;
}
};
void dfs(int pos, int prev){
for(int i = 1; i < 18; i++) succ[pos][i] = succ[succ[pos][i - 1]][i - 1];
for(auto x : adj[pos]){
if(x == prev) continue;
dep[x] = dep[pos] + 1;
succ[x][0] = pos;
dfs(x, pos);
}
}
void lift(int &b, int steps){
for(int i = 17; i >= 0; i--){
if(steps & (1 << i)) b = succ[b][i];
}
}
int sld(int a, int b){
int ret = 0;
for(int i = 17; i >= 0; i--){
if(succ[a][i] != succ[b][i]){
a = succ[a][i];
b = succ[b][i];
ret += (1 << i) * 2;
}
}
return ret + 2;
}
int dist(int a, int b){
int ret = 0;
if(dep[a] > dep[b]) swap(a, b);
ret += dep[b] - dep[a], lift(b, dep[b] - dep[a]);
if(a == b) return ret;
return ret + sld(a, b);
}
int main(void){
fastio;
cin>>n;
for(int i = 0; i < n; i++) cin>>h[i], h[i]--, id[h[i]] = i;
for(int i = 0; i < n - 1; i++){
int a, b;
cin>>a>>b;
a--, b--;
adj[a].pb(b);
adj[b].pb(a);
if(h[a] < h[b]) swap(a, b);
edge.eb(a, b);
}
sort(ALL(edge), [&](pll a, pll b) -> bool { return h[a.f] < h[b.f];});
dfs(0, 0);
DSU dsu(n);
vector<ll> ans(n); // store ans of element of height i
for(auto [a, b] : edge){ // h[a] > h[b]
b = dsu.root(b);
ans[h[a]] = max(ans[h[a]], ans[h[b]] + dist(a, b));
dsu.unite(a, b);
}
cout<<ans[n - 1]<<"\n";
}
# | 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... |