Submission #744518

#TimeUsernameProblemLanguageResultExecution timeMemory
744518t6twotwoRoad Closures (APIO21_roads)C++17
0 / 100
2085 ms28376 KiB
#include "roads.h" #include <bits/stdc++.h> using namespace std; using ll = long long; constexpr ll inf = 1E18; vector<ll> minimum_closure_costs(int N, vector<int> U, vector<int> V, vector<int> W) { if (N <= 2000) { vector<vector<pair<int, int>>> adj(N); for (int i = 0; i < N - 1; i++) { adj[U[i]].emplace_back(V[i], W[i]); adj[V[i]].emplace_back(U[i], W[i]); } vector dp(N, vector<ll>(N, inf)); auto dfs = [&](auto dfs, int x, int p) -> void { dp[x][0] = 0; vector<pair<int, int>> ch; for (auto [y, z] : adj[x]) { if (y == p) { continue; } dfs(dfs, y, x); dp[x][0] += dp[y][0] + z; ch.emplace_back(y, z); } for (int i = 1; i < N; i++) { vector<ll> a(i + 1, inf); a[0] = 0; for (auto [y, z] : ch) { auto b = a; a.assign(i + 1, inf); for (int j = 0; j <= i; j++) { a[j] = min(a[j], b[j] + dp[y][i] + z); if (j + 1 <= i) { a[j + 1] = min(a[j + 1], b[j] + dp[y][i - 1]); } } } dp[x][i] = *min_element(a.begin(), a.end()); } }; dfs(dfs, 0, -1); return dp[0]; } if (U == vector<int>(N - 1)) { vector<ll> ans(N); sort(W.begin(), W.end()); for (int i = 0; i < N - 1; i++) { ans[N - i - 2] = ans[N - i - 1] + W[i]; } return ans; } ll dp0 = 0, dp1 = 0; for (int i = 0; i < N; i++) { ll pd0 = dp0; dp0 = max(dp0, dp1); dp1 = W[i] + pd0; } vector<ll> ans(N); ans[0] = accumulate(W.begin(), W.end(), 0LL); ans[1] = ans[0] - max(dp0, dp1); return ans; }
#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...