제출 #881658

#제출 시각아이디문제언어결과실행 시간메모리
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...