Submission #1133732

#TimeUsernameProblemLanguageResultExecution timeMemory
1133732PagodePaivaRoad Closures (APIO21_roads)C++17
24 / 100
360 ms65860 KiB
#include<bits/stdc++.h> #include "roads.h" #include <vector> #define ll long long using namespace std; const ll N = 2010; const ll inf = 1e18/N; vector <pair<ll, ll>> g[N]; ll dp[N][N][2]; void solve(ll p, ll v, ll k, ll fg){ if(dp[v][k][fg] != -1) return; ll sum = 0; vector <ll> best; for(auto [x, w] : g[v]){ if(x == p) continue; solve(v, x, k, 0); solve(v, x, k, 1); sum += dp[x][k][0]; best.push_back(dp[x][k][1]-dp[x][k][0]+w); } ll deg = g[v].size(); deg -= fg; sort(best.begin(), best.end()); reverse(best.begin(), best.end()); while(deg > k or (!best.empty() ? best.back() <= 0 : false)){ if(best.empty()) break; sum += best.back(); deg--; best.pop_back(); } dp[v][k][fg] = (deg > k ? inf : sum); return; } vector<long long> minimum_closure_costs(int n, std::vector<int> U, std::vector<int> V, std::vector<int> W) { memset(dp, -1, sizeof dp); for(ll i = 0;i < n-1;i++){ g[U[i]+1].push_back({V[i]+1, W[i]}); g[V[i]+1].push_back({U[i]+1, W[i]}); } vector <ll> ans; for(ll k = 0;k < n;k++){ solve(1, 1, k, 0); ans.push_back(dp[1][k][0]); } 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...