제출 #828673

#제출 시각아이디문제언어결과실행 시간메모리
828673lukameladzeCat Exercise (JOI23_ho_t4)C++17
100 / 100
376 ms49476 KiB
# 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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...