Submission #1262531

#TimeUsernameProblemLanguageResultExecution timeMemory
1262531nguynCat Exercise (JOI23_ho_t4)C++20
100 / 100
108 ms45596 KiB
#include <bits/stdc++.h>

using namespace std;

#define ll long long
#define F first
#define S second
#define pb push_back
#define pii pair<int, int>

const int N = 2e5 + 5;

int n;
int p[N];
vector<int> g[N];

int mx[N], lab[N];
int h[N];
int up[N][18];
ll f[N];

void dfs(int u, int p) {
    for (int v : g[u]) {
        if (v == p) continue;
        h[v] = h[u] + 1;
        up[v][0] = u;
        for (int i = 1; i < 18; i++) {
            up[v][i] = up[up[v][i - 1]][i - 1];
        }
        dfs(v, u);
    }
}

int lca(int u, int v) {
    if (h[v] != h[u]) {
        if (h[u] < h[v]) swap(u, v);
        int k = h[u] - h[v];
        for (int i = 0; (1 << i) <= k; i++) {
            if (k >> i & 1) {
                u = up[u][i];
            }
        }
    }
    if (u == v) return u;
    for (int i = 17; i >= 0; i--) {
        if (up[u][i] != up[v][i]) {
            u = up[u][i];
            v = up[v][i];
        }
    }
    return up[u][0];
}

int find(int u) {
    return lab[u] < 0 ? u : lab[u] = find(lab[u]);
}

void join(int u, int v) {
    if ((u = find(u)) == (v = find(v))) return;
    if (lab[u] > lab[v]) swap(u, v);
    lab[u] += lab[v];
    mx[u] = max(mx[u], mx[v]);
    lab[v] = u;
}

int dist(int u, int v) {
    return h[u] + h[v] - 2 * h[lca(u, v)];
}

signed main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> p[i];
        mx[i] = i; lab[i] = -1;
    }
    for (int i = 1; i < n; i++) {
        int u, v;
        cin >> u >> v;
        u = p[u];
        v = p[v];
        g[u].pb(v);
        g[v].pb(u);
    }
    dfs(1, 0);
    for (int i = 1; i <= n; i++) {
        for (int j : g[i]) {
            int v = mx[find(j)];
            if (v < i) {
                join(i, v);
                f[i] = max(f[i], f[v] + dist(i, v));
            }
        }
    }
    cout << f[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...