이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
# include <bits/stdc++.h>
using namespace std;
#define f first
#define s second
#define ll long long
#define pii pair <int, int>
#define pb push_back
const int N = 3e5 + 5;
int n, a[N], lv[N], par[N][20],tin, in[N], out[N], p[N], mx[N], inv[N];
vector <int> v[N];
ll dp[N];
void dfs(int a, int p) {
par[a][0] = p;
in[a] = ++tin;
lv[a] = lv[p] + 1;
for (int i = 1; i <= 18; i++) {
par[a][i] = par[par[a][i - 1]][i - 1];
}
for (int to : v[a]) {
if (to == p) continue;
dfs(to, a);
}
out[a] = ++tin;
}
int upper(int a, int b) {
return (in[a] <= in[b] && out[a] >= out[b]);
}
int lca(int a, int b) {
if (upper(a, b)) return a;
for (int i = 18; i >= 0; i--) {
if (par[a][i] && !upper(par[a][i], b)) a = par[a][i];
}
return par[a][0];
}
int dist(int a, int b) {
return lv[a] + lv[b] - 2 * lv[lca(a, b)];
}
int get_col(int a) {
if (a == p[a]) return a;
else return p[a] = get_col(p[a]);
}
void col(int a, int b) {
a = get_col(a);
b = get_col(b);
if (a == b) return ;
p[b] = a;
mx[a] = max(mx[a], mx[b]);
}
void init() {
for (int i = 1; i <= n ;i++) {
p[i] = i;
mx[i] = a[i];
}
}
signed main() {
cin>>n;
for (int i = 1; i <= n; i++) {
cin>>a[i];
inv[a[i]] = i;
}
for (int i = 1; i <= n - 1; i++) {
int a, b;
cin>>a>>b;
v[a].pb(b);
v[b].pb(a);
}
init();
dfs(1, 0);
for (int i = 1; i <= n; i++) {
int vert = inv[i];
for (int to : v[vert]) {
if (a[to] > i) continue;
int nxt_vert = get_col(to); // maximum in the "subtree"
dp[vert] = max(dp[vert], dp[nxt_vert] + dist(nxt_vert, vert));
// cout<<vert <<" -- > "<<to<<" "<<nxt_vert<<" "<<dist(nxt_vert, vert)<<" "<<dp[vert]<<"\n";
}
for (int to : v[vert]) {
if (a[to] > i) continue;
col(vert, to);
}
}
cout<<dp[inv[n]]<<"\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... |