Submission #1360337

#TimeUsernameProblemLanguageResultExecution timeMemory
1360337gayCat Exercise (JOI23_ho_t4)C++20
31 / 100
2102 ms255120 KiB
#include <bits/stdc++.h>

using namespace std;

using ld = long double;
using ll = long long;

const int INF = 1e9, MOD = 1e9 + 7;

void solve();

signed main() {
#ifdef LOCAL
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
#endif
    ios::sync_with_stdio(false);
    cin.tie(0);
    int q = 1;
    while (q--) {
        solve();
    }
}

vector<vector<ll>> g;
vector<ll> sz, par, used, lev;
vector<vector<ll>> ds, num;
vector<vector<ll>> l, r;

void get_sz(ll v, ll p) {
    sz[v] = 1;
    for (auto u : g[v]) {
        if (u == p || used[u]) continue;
        get_sz(u, v);
        sz[v] += sz[u];
    }
}

ll Find_centroid(ll v, ll p, ll all) {
    ll next = -1;
    for (auto u : g[v]) {
        if (u == p || used[u]) continue;
        if (sz[u] > all / 2) next = u;
    }
    if (next == -1) return v;
    return Find_centroid(next, v, all);
}

vector<vector<ll>> cnt;

void calc(ll v, ll p, ll f, ll lv, ll lf, ll rf, ll c, ll& id) {
    ds[lv][v] = f;
    num[lv][v] = id++;
    l[lv][v] = lf;
    r[lv][v] = rf;
    cnt[c].push_back(-INF);
    for (auto u : g[v]) {
        if (u == p || used[u]) continue;
        calc(u, v, f + 1, lv, lf, rf, c, id);
    }
}

void build(ll v, ll p, ll level) {
    get_sz(v, -1);
    v = Find_centroid(v, -1, sz[v]);
    lev[v] = level;
    par[v] = p;
    used[v] = 1;
    get_sz(v, -1);
    ll id = 1;
    ds[level][v] = 0;
    num[level][v] = 0;
    cnt[v].push_back(-INF);
    for (auto u : g[v]) {
        calc(u, -1, 1, level, id, id + sz[u] - 1, v, id);
    }

    for (auto u : g[v]) {
        if (!used[u]) build(u, v, level + 1);
    }
}

vector<ll> p, val;

vector<vector<ll>> del;

void upd(ll c, ll v, ll x) {
    if (c == -1) return;
    if (!del[lev[c]][v]) {
        cnt[c][num[lev[c]][v]] = max(cnt[c][num[lev[c]][v]], x);
    }
    upd(par[c], v, x);
}

void solve() {
    ll n; cin >> n;
    p.resize(n), val.resize(n);
    for (int i = 0; i < n; i++) {
        cin >> val[i]; val[i]--;
        p[val[i]] = i;
    }
    g.resize(n);
    for (int i = 1; i < n; i++) {
        ll a, b; cin >> a >> b;
        a--, b--;
        g[a].push_back(b);
        g[b].push_back(a);
    }

    sz.resize(n), par.resize(n, -1),
    used.resize(n), lev.resize(n);
    ds.resize(20, vector<ll>(n));
    num.resize(20, vector<ll>(n));
    l.resize(20, vector<ll>(n));
    r.resize(20, vector<ll>(n));
    del.resize(20, vector<ll>(n));
    cnt.resize(n);
    build(0, -1, 0);

    vector<ll> dp(n, -INF), cx(n, -INF);
    dp[n - 1] = 0;
    for (auto v : g[p[n - 1]]) {
        cx[v] = 1;
        upd(v, v, 1);
    }
    for (ll i = n - 2; i >= 0; i--) {
        queue<ll> bfs;
        bfs.push(p[i]);
        vector<ll> dist(n, -1);
        dist[p[i]] = 0;
        while (!empty(bfs)) {
            ll v = bfs.front(); bfs.pop();
            dp[i] = max(dp[i], cx[v] + dist[v]);
            for (auto u : g[v]) {
                if (val[u] > i) continue;
                if (dist[u] == -1) {
                    dist[u] = dist[v] + 1;
                    bfs.push(u);
                }
            }
        }
        for (auto v : g[p[i]]) {
            cx[v] = max(cx[v], dp[i] + 1);
            upd(v, v, dp[i] + 1);
        }
    }
    ll ans = 0;
    for (int i = 0; i < n; i++) {
        ans = max(ans, dp[i]);
    }
    cout << ans;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...