Submission #1040236

#TimeUsernameProblemLanguageResultExecution timeMemory
1040236TAhmed33Cat Exercise (JOI23_ho_t4)C++98
100 / 100
264 ms73808 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int MAXN = 2e5 + 25;
const int B = 19;
typedef long long ll;
int a[MAXN], n;
vector <int> adj[MAXN];
struct DSU {
    int par[MAXN];
    void init () {
        for (int i = 1; i <= n; i++) {
            par[i] = i; 
        }
    }
    int find (int x) {
        return par[x] == x ? x : par[x] = find(par[x]);
    }
    void merge (int x, int y) {
        x = find(x); y = find(y);
        if (x == y) return;
        if (a[x] > a[y]) {
            par[y] = x;
        } else {
            par[x] = y;
        }
    }
} cur;
vector <int> adj2[MAXN];
int dp[B][MAXN], dep[MAXN];
int jump (int x, int y) {
    for (int i = B - 1; i >= 0; i--) {
        if (y & (1 << i)) {
            x = dp[i][x];
        }
    }
    return x;
}
int lca (int x, int y) {
    if (dep[x] > dep[y]) swap(x, y);
    y = jump(y, dep[y] - dep[x]);
    if (x == y) return x ;
    for (int i = B - 1; i >= 0; i--) {
        if (dp[i][x] != dp[i][y]) {
            x = dp[i][x], y = dp[i][y];
        }
    }
    return dp[0][x];
}
ll dist (int x, int y) {
    return dep[x] + dep[y] - 2 * dep[lca(x, y)];
}
ll dfs (int pos) {
    if (adj2[pos].empty()) return 0;
    ll mx = 0;
    for (auto j : adj2[pos]) {
        mx = max(mx, dist(j, pos) + dfs(j));
    }
    return mx;
}
void dfs2 (int pos, int par) {
    for (auto j : adj[pos]) {
        if (j != par) {
            dp[0][j] = pos;
            for (int i = 1; i < B; i++) {
                dp[i][j] = dp[i - 1][dp[i - 1][j]];
            }
            dep[j] = 1 + dep[pos];
            dfs2(j, pos);
        }
    }
}
void solve () {
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    }
    for (int i = 1; i < n; i++) {
        int x, y; cin >> x >> y;
        adj[x].push_back(y);
        adj[y].push_back(x);
    }
    dfs2(1, 0);
    vector <int> ii;
    for (int i = 1; i <= n; i++) {
        ii.push_back(i);
    }
    sort(ii.begin(), ii.end(), [&] (int x, int y) {
        return a[x] < a[y];
    });
    cur.init();
    for (auto i : ii) {
        for (auto j : adj[i]) {
            if (a[j] > a[i]) {
                continue;
            }
            adj2[i].push_back(cur.find(j));
            cur.merge(i, cur.find(j));
        }
    }
    int root = -1;
    for (int i = 1; i <= n; i++) {
        if (a[i] == n) {
            root = i;
        }
    }
    cout << dfs(root) << '\n';
}       
signed main () {
    ios::sync_with_stdio(0); cin.tie(0);
    int tc = 1; //cin >> tc;
    while (tc--) solve();
}
#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...