Submission #716525

#TimeUsernameProblemLanguageResultExecution timeMemory
716525StickfishPaths (RMI21_paths)C++17
56 / 100
406 ms37200 KiB
#include <iostream> #include <vector> #include <algorithm> using namespace std; using ll = long long; const int MAXN = 1e5 + 123; vector<pair<int, int>> edg[MAXN]; ll cost[MAXN * 2]; pair<int, int> edges[MAXN * 3]; vector<ll> dp[MAXN * 2]; void get_dp(int e, int k) { if (dp[e].size()) return; auto [rt, v] = edges[e]; for (auto [u, ne] : edg[v]) { if (u == rt) continue; get_dp(ne, k); vector<ll> ndp(dp[e].size() + dp[ne].size()); merge(dp[e].rbegin(), dp[e].rend(), dp[ne].rbegin(), dp[ne].rend(), ndp.rbegin()); ndp.resize(min(int(ndp.size()), k)); dp[e] = ndp; } if (dp[e].empty()) { dp[e] = {cost[e]}; } else { dp[e][0] += cost[e]; } } signed main() { int n, k; cin >> n >> k; for (int i = 0; i + 1 < n; ++i) { int u, v, c; cin >> u >> v >> c; --u, --v; edg[u].push_back({v, i * 2}); edg[v].push_back({u, i * 2 + 1}); edges[i * 2] = {u, v}; edges[i * 2 + 1] = {v, u}; cost[i * 2] = cost[i * 2 + 1] = c; } for (int e = 2 * n; e < 3 * n; ++e) { edges[e] = {n, e - 2 * n}; get_dp(e, k); ll ans = 0; for (auto x : dp[e]) ans += x; cout << ans << '\n'; } //for (int e = 0; e < n * 2 - 1; ++e) //get_dp(e, k); //for (int v = 0; v < n; ++v) { //vector<ll> ans; //for (auto [u, e] : edg[v]) { //vector<ll> ndp(ans.size() + dp[e].size()); //merge(dp[e].rbegin(), dp[e].rend(), ans.rbegin(), ans.rend(), ndp.rbegin()); //ndp.resize(min(int(ndp.size()), k)); //ans = ndp; //} //ll anssm = 0; //for (auto x : ans) //anssm += x; //cout << anssm << '\n'; //} }
#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...