Submission #1223660

#TimeUsernameProblemLanguageResultExecution timeMemory
1223660JerRoad Closures (APIO21_roads)C++20
0 / 100
17 ms3144 KiB
#include "roads.h" #include <bits/stdc++.h> #include <vector> using namespace std; typedef long long ll; const int MAXN = 205; int n; ll total = 0; ll dp[MAXN][MAXN]; #define w(i) i.first #define u(i) i.second vector<pair<int, int>> con[MAXN]; ll solve(int curr, int par, int k){ if (k < 0) return -LONG_LONG_MAX; if (dp[curr][k] != -1) return dp[curr][k]; vector<pair<ll, int>> best, out, dif; for (auto i : con[curr]){ if (u(i) == par) continue; best.push_back({solve(u(i), curr, k - 1) + w(i), u(i)}); } for (auto i : con[curr]){ if (u(i) == par) continue; out.push_back({solve(u(i), curr, k), u(i)}); } for (int i = 0; i < best.size(); i++) dif.push_back({best[i].first - out[i].first, i}); ll res = 0; vector<bool> used (best.size(), false); sort(dif.begin(), dif.end(), greater<pair<ll, int>>()); for (auto i : out) res += i.first; for (int i = 0; i < k and i < best.size(); i++) if (dif[i].first > 0) res += dif[i].first; dp[curr][k] = res; return res; } std::vector<long long> minimum_closure_costs(int N, std::vector<int> U, std::vector<int> V, std::vector<int> W) { n = N; for (int i = 0; i < n - 1; i++) con[U[i]].push_back({W[i], V[i]}), con[V[i]].push_back({W[i], U[i]}), total += W[i]; vector<ll> res; for (int k = 0; k < n; k++){ for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) dp[i][j] = -1; res.push_back(total - solve(0, -1, k)); } return res; }
#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...