Submission #1279019

#TimeUsernameProblemLanguageResultExecution timeMemory
1279019Bui_Quoc_CuongCat Exercise (JOI23_ho_t4)C++20
31 / 100
458 ms99516 KiB
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;

int n;
int a[N];
vector <int> ke[N];
int par[N];

namespace sub1 {
    int dp[5005];
    int dist[5005][5005];

    void DFS (int u) {
        for (int &v : ke[u]) if (v != par[u]) {
            par[v] = u;
            DFS(v);
        }
    }

    int find_max (int root, int border, int lim) {   
        vector <int> vis(n + 2, 0);
        vis[root] = vis[border] = true;
        queue <int> que;
        int max_node = 0;
        que.push(root);
        while (!que.empty()) {
            int u = que.front();
            que.pop();
            if (a[u] > a[max_node]) max_node = u;
            vis[u] = true;  
            for (int &v : ke[u]) if (!vis[v] && a[v] < lim) {
                que.push(v);
            }
        }
        return max_node;
    }

    int find_max_son (int u, int p, int lim) {
        int max_son = u;
        for (int &v : ke[u]) {
            if (v == p || a[v] > lim) continue;
            int choke = find_max_son (v, u, lim);
            if (a[choke] > a[max_son]) max_son = choke;
        }
        return max_son;
    }

    int dfs (int u, int p) {   
        if (dp[u] != - 1) return dp[u];
        dp[u] = 0;

        vector <int> umax;
        int s0 = find_max (u, p, a[u]);

        if (s0 != - 1 && s0 != u) umax.push_back(s0);

        for (int &v : ke[u]) if (a[v] < a[u]) {
            int sv = find_max_son (v, u, a[u]);
            if (sv != u) umax.push_back(sv);
        }

        for (int &v : umax) {
            dp[u] = max(dp[u], dfs(v, u) + dist[u][v]);
        }

        return dp[u];
    }   

    void solve () {
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                dist[i][j] = 2e9;
            }
            queue <int> que;
            dist[i][i] = 0;
            que.push(i);
            while (!que.empty()) {
                int u = que.front();
                que.pop();
                for (int &v : ke[u]) if (dist[i][v] > dist[i][u] + 1) {
                    dist[i][v] = dist[i][u] + 1;
                    que.push(v);
                }
            }
        }
        int root = max_element(a + 1, a + 1 + n) - a;
        DFS(root);
        memset(dp, - 1, sizeof dp);
        cout << dfs(root, 0);
    }
}

void solve () {
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    }
    for (int i = 1; i < n; i++) {
        int u, v; cin >> u >> v;
        ke[u].push_back(v); ke[v].push_back(u);
    }

    if (n <= 5000) {
        sub1 :: solve();
    }
}

signed main () {
    ios_base::sync_with_stdio(0); cin.tie(0);
    #define kieuoanh "kieuoanh"

    if (fopen(kieuoanh".inp", "r")) {
        freopen(kieuoanh".inp", "r", stdin); freopen(kieuoanh".out", "w", stdout);
    }

    solve();

    return 0;
}

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:114:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  114 |         freopen(kieuoanh".inp", "r", stdin); freopen(kieuoanh".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
Main.cpp:114:53: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  114 |         freopen(kieuoanh".inp", "r", stdin); freopen(kieuoanh".out", "w", stdout);
      |                                              ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#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...