Submission #1210734

#TimeUsernameProblemLanguageResultExecution timeMemory
1210734duckindogRoad Closures (APIO21_roads)C++17
24 / 100
2096 ms19684 KiB
#include "roads.h"

#include <bits/stdc++.h>

using namespace std;

const int MAXN = 100'000 + 10;
const long long MAX = 1'000'000'000'000'000;
int n;
vector<pair<int, int>> ad[MAXN];

long long parW[MAXN];
int k;
long long f[MAXN][2];
void dfs(int u, int p = -1) { 
	for (const auto& [v, w] : ad[u]) { 
		if (v == p) continue;
		parW[v] = w;
		dfs(v, u);
	}

	long long sum = 0;
	vector<long long> best;
	for (const auto& [v, w] : ad[u]) { 
		if (v == p) continue;
		sum += min(f[v][0], f[v][1]);
		best.push_back(f[v][1] - min(f[v][0], f[v][1]));
	}
	sort(best.begin(), best.end());

	int cnt = ad[u].size() - k;
	if (cnt <= (int)best.size()) { 
		f[u][0] = sum + accumulate(best.begin(), best.begin() + max(0, cnt), 0ll);
		f[u][1] = sum + accumulate(best.begin(), best.begin() + max(0, cnt - 1), 0ll) + parW[u];
	} else { 
		f[u][0] = MAX;
		f[u][1] = sum + accumulate(best.begin(), best.end(), 0ll) + parW[u];
	}
}

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) { 
		int u = U[i], v = V[i], w = W[i];
		ad[u].push_back({v, w});
		ad[v].push_back({u, w});
  	}

	parW[0] = MAX;
	vector<long long> ret;
	for (k = 0; k < n; ++k) { 
		for (int i = 0; i < n; ++i) f[i][0] = f[i][1] = MAX;
		dfs(0);

		ret.push_back(f[0][0]);
	}
  	return ret;
}
#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...