#include <cassert>
#include <cstdio>
#include <vector>
#include <cassert>
#include <cstdio>
#include <vector>
#include<bits/stdc++.h>
using namespace std;
long long dp[100005][2]; //dp[v][0] = 0/1 -> connected with parent or not
vector<pair<int,int>> adj[100005];
void dfs(int v,int p,int k)
{
    dp[v][0] = dp[v][1] = 0;
    vector<long long> diffs;
    for(auto e : adj[v])
    {
        int u = e.first;
        long long w = e.second;
        if(u != p)
        {
            dfs(u,v,k);
            dp[v][0] += dp[u][0] + w;
            dp[v][1] += dp[u][0] + w;
            diffs.push_back({dp[u][1] - w - dp[u][0]});
        }
    }
    sort(diffs.begin(),diffs.end());
    int L = diffs.size();
    for(int j = 0 ; j < min(L,k) ; j++)
    {
        if(diffs[j] < 0)
        {
            dp[v][0] += diffs[j];
            if(j != k-1)
                dp[v][1] += diffs[j];
        }
    }
}
std::vector<long long> minimum_closure_costs(int N, std::vector<int> U, std::vector<int> V, std::vector<int> W) {
    for(int i = 0 ; i < N ; i++)
    {
        U[i]++;
        V[i]++;
        adj[U[i]].push_back({V[i],W[i]});
        adj[V[i]].push_back({U[i],W[i]});
    }
    vector<long long> ret;
    for(int k = 0 ; k <= N - 1 ; k++)
    {
        dfs(1,1,k);
        ret.push_back(dp[1][0]);
    }
    return ret;
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |