Submission #881658

#TimeUsernameProblemLanguageResultExecution timeMemory
881658AlcabelCat Exercise (JOI23_ho_t4)C++17
31 / 100
515 ms196948 KiB
#include <bits/stdc++.h>
using namespace std;

const int maxn = 5e3;
int a[maxn];
vector<int> g[maxn];
int mx[maxn][maxn], dist[maxn][maxn];

void dfsMax(int v, int p, int root) {
    for (const int& u : g[v]) {
        if (u != p) {
            mx[root][u] = max(mx[root][v], a[u]);
            dist[root][u] = dist[root][v] + 1;
            dfsMax(u, v, root);
        }
    }
}

void solve() {
    int n;
    cin >> n;
    vector<int> posOf(n);
    for (int i = 0; i < n; ++i) {
        cin >> a[i];
        --a[i];
        posOf[a[i]] = i;
    }
    for (int i = 0; i < n - 1; ++i) {
        int v, u;
        cin >> v >> u;
        --v, --u;
        g[v].emplace_back(u);
        g[u].emplace_back(v);
    }
    for (int r = 0; r < n; ++r) {
        mx[r][r] = a[r];
        dist[r][r] = 0;
        dfsMax(r, -1, r);
    }
    vector<long long> dp(n);
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < i; ++j) {
            if (mx[posOf[i]][posOf[j]] <= i) {
                dp[i] = max(dp[i], dp[j] + dist[posOf[i]][posOf[j]]);
            }
        }
    }
    cout << dp[n - 1] << '\n';
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    
#ifdef LOCAL
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    int T = 1;
    cin >> T;
    while (T--) {
        solve();
        cerr << "-----------\n";
        cout << "-----------\n";
    }
#else
    int T = 1;
    // cin >> T;
    while (T--) {
        solve();
    }
#endif

    return 0;
}
#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...