Submission #922579

#TimeUsernameProblemLanguageResultExecution timeMemory
922579Shayan86Cat Exercise (JOI23_ho_t4)C++14
100 / 100
281 ms48976 KiB
#include <bits/stdc++.h>
using namespace std;

#pragma GCC optimize("O3,unroll-loops")
// #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
// Ofast, O0, O1, O2, O3, unroll-loops, fast-math, trapv

typedef long long ll;
typedef pair<ll, ll> pll;
typedef pair<int, int> pii;

#define Mp          make_pair
#define sep         ' '
#define endl        '\n'
#define F	        first
#define S	        second
#define pb          push_back
#define all(x)      (x).begin(),(x).end()
#define kill(res)	cout << res << '\n', exit(0);
#define set_dec(x)	cout << fixed << setprecision(x);
#define fast_io     ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define file_io     freopen("input.txt", "r", stdin) ; freopen("output.txt", "w", stdout);

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

const ll L = 20;
const ll N = 2e5 + 50;
const ll Mod = 1e9 + 7;

int n, p[N], ver[N], h[N], par[N][L], pr[N], sz[N], mxh[N]; ll val[N];

vector<int> adj[N];

void dfs(int v, int p = 0){
    par[v][0] = p;
    for(int i = 1; i < L; i++){
        if(!par[v][i-1]) break;
        par[v][i] = par[par[v][i-1]][i-1];
    }

    for(int u: adj[v]){
        if(u == p) continue;
        h[u] = h[v] + 1; dfs(u, v);
    }
}

int getkth(int v, int k){
    for(int i = 0; i < L; i++){
        if(k >> i & 1) v = par[v][i];
    }
    return v;
}

int lca(int u, int v){
    if(h[v] < h[u]) swap(u, v);
    v = getkth(v, h[v] - h[u]);
    if(u == v) return v;

    for(int i = L-1; i >= 0; i--){
        if(par[v][i] != par[u][i]){
            v = par[v][i]; u = par[u][i];
        }
    }
    return par[v][0];
}

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

int getPar(int v){
    return (pr[v] == v ? v : pr[v] = getPar(pr[v]));
}

void Union(int u, int v, int a, ll b){
    u = getPar(u);
    v = getPar(v);
    if(u == v) return;
    if(sz[v] < sz[u]) swap(u, v);

    sz[v] += sz[u];
    pr[u] = v;
    mxh[v] = a;
    val[v] = b;
}

int main(){
    fast_io;
    
    cin >> n;

    for(int i = 1; i <= n; i++){
        cin >> p[i]; ver[p[i]] = i;
    }

    int u, v;
    for(int i = 1; i < n; i++){
        cin >> u >> v;
        adj[u].pb(v);
        adj[v].pb(u);
    }

    dfs(1);

    for(int i = 1; i <= n; i++){
        pr[i] = i; sz[i] = 1; mxh[i] = p[i];
    }

    for(int i = 1; i <= n; i++){
        v = ver[i];
        ll ans = 0;
        for(int u: adj[v]){
            if(p[u] > p[v]) continue;
            int up = getPar(u);
            ans = max(ans, val[up] + dist(ver[mxh[up]], v));
        }
        for(int u: adj[v]){
            if(p[u] > p[v]) continue;
            Union(u, v, i, ans);
        }

        if(i == n) cout << ans << endl;
    }

}
#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...