Submission #2301296


Source Code Expand

#include <vector>
#include <iostream>
#include <algorithm>
#include <functional>
using namespace std;
struct edge {
	int to, cost;
	edge() : to(-1), cost(0) {};
	edge(int to_, int cost_) : to(to_), cost(cost_) {};
};
int X;
long long calc(vector<int> v) {
	int N = v.size();
	sort(v.begin(), v.end());
	long long ret = 0, sum = 0; int pl = 0;
	for (int i = N - 1; i >= 0; i--) {
		while (pl != N && v[i] + v[pl] < X) sum += v[pl++];
		ret += sum + 1LL * pl * v[i] + 1LL * (N - pl) * X;
		ret -= min(v[i] * 2, X);
	}
	return ret / 2;
}
long long solve(vector<vector<edge> > G) {
	int N = G.size();
	if (N == 1) return 0;
	vector<int> c(N);
	function<void(int, int)> init_dfs = [&](int pos, int pre) {
		c[pos] = 1;
		for (edge e : G[pos]) {
			if (e.to == pre) continue;
			init_dfs(e.to, pos);
			c[pos] += c[e.to];
		}
	};
	init_dfs(0, -1);
	int gravity = -1;
	for (int i = 0; i < N; i++) {
		bool ok = (c[i] * 2 >= N);
		for (edge e : G[i]) {
			if (c[e.to] < c[i] && c[e.to] * 2 > N) ok = false;
		}
		if (ok) gravity = i;
	}
	long long ret = 0;
	vector<int> all_d({ 0 });
	for (edge e : G[gravity]) {
		vector<vector<edge> > GN(1);
		vector<int> d({ min(e.cost, X + 1) });
		function<void(int, int, int)> dfs = [&](int pos, int id, int pre) {
			for (edge ee : G[pos]) {
				if (ee.to == pre) continue;
				GN[id].push_back(edge(GN.size(), ee.cost));
				GN.push_back({ edge(id, ee.cost) });
				d.push_back(min(d[id] + ee.cost, X + 1));
				dfs(ee.to, GN.size() - 1, pos);
			}
		};
		dfs(e.to, 0, gravity);
		all_d.insert(all_d.end(), d.begin(), d.end());
		ret -= calc(d);
		ret += solve(GN);
	}
	ret += calc(all_d);
	return ret;
}
int main() {
	cin.tie(0);
	ios_base::sync_with_stdio(false);
	int N;
	cin >> N >> X;
	vector<int> A(N - 1), B(N - 1), C(N - 1), D(N, 1 << 30);
	vector<vector<edge> > G(N);
	for (int i = 0; i < N - 1; i++) {
		cin >> A[i] >> B[i] >> C[i], A[i]--, B[i]--;
		G[A[i]].push_back(edge(B[i], C[i])); D[A[i]] = min(D[A[i]], C[i]);
		G[B[i]].push_back(edge(A[i], C[i])); D[B[i]] = min(D[B[i]], C[i]);
	}
	long long ret = solve(G);
	for (int i = 0; i < N - 1; i++) {
		ret -= min(C[i], X);
		int val = min(C[i], X + min(D[A[i]], D[B[i]]));
		if (G[A[i]].size() + G[B[i]].size() != N) val = min(val, 2 * X);
		else if (G[A[i]].size() != 1 && G[B[i]].size() != 1) val = min(val, 3 * X);
		ret += val;
	}
	cout << ret << endl;
	return 0;
}

Submission Info

Submission Time
Task D - 道路網
User square1001
Language C++14 (GCC 5.4.1)
Score 1200
Code Size 2452 Byte
Status AC
Exec Time 459 ms
Memory 35244 KB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 1200 / 1200
Status
AC × 2
AC × 46
Set Name Test Cases
Sample 00_example_01.txt, 00_example_02.txt
All 00_example_01.txt, 00_example_02.txt, 10_rand_01.txt, 10_rand_02.txt, 10_rand_03.txt, 10_rand_04.txt, 10_rand_05.txt, 20_k-ary_01.txt, 20_k-ary_02.txt, 20_k-ary_03.txt, 20_k-ary_04.txt, 20_k-ary_05.txt, 20_k-ary_06.txt, 20_k-ary_07.txt, 20_k-ary_08.txt, 20_k-ary_09.txt, 20_k-ary_10.txt, 30_star_01.txt, 30_star_02.txt, 30_star_03.txt, 30_star_04.txt, 30_star_05.txt, 40_pseudostar_01.txt, 40_pseudostar_02.txt, 40_pseudostar_04.txt, 40_pseudostar_05.txt, 40_pseudostar_06.txt, 50_line_01.txt, 50_line_02.txt, 50_line_03.txt, 60_max_01.txt, 60_max_02.txt, 60_max_03.txt, 60_max_04.txt, 70_hand_01.txt, 70_hand_02.txt, 71_hand_01.txt, 72_hand_01.txt, 80_kill2X_01.txt, 80_kill2X_02.txt, 80_kill2X_03.txt, 80_kill2X_04.txt, 80_kill2X_05.txt, 80_kill2X_06.txt, 80_kill2X_07.txt, 80_kill2X_08.txt
Case Name Status Exec Time Memory
00_example_01.txt AC 1 ms 256 KB
00_example_02.txt AC 1 ms 256 KB
10_rand_01.txt AC 1 ms 256 KB
10_rand_02.txt AC 2 ms 384 KB
10_rand_03.txt AC 2 ms 384 KB
10_rand_04.txt AC 2 ms 384 KB
10_rand_05.txt AC 2 ms 384 KB
20_k-ary_01.txt AC 450 ms 22948 KB
20_k-ary_02.txt AC 450 ms 22948 KB
20_k-ary_03.txt AC 459 ms 22948 KB
20_k-ary_04.txt AC 284 ms 25164 KB
20_k-ary_05.txt AC 213 ms 21648 KB
20_k-ary_06.txt AC 119 ms 20916 KB
20_k-ary_07.txt AC 114 ms 16956 KB
20_k-ary_08.txt AC 113 ms 15828 KB
20_k-ary_09.txt AC 109 ms 15736 KB
20_k-ary_10.txt AC 111 ms 15688 KB
30_star_01.txt AC 73 ms 15604 KB
30_star_02.txt AC 76 ms 15604 KB
30_star_03.txt AC 76 ms 15604 KB
30_star_04.txt AC 78 ms 15604 KB
30_star_05.txt AC 78 ms 15604 KB
40_pseudostar_01.txt AC 84 ms 16244 KB
40_pseudostar_02.txt AC 83 ms 19060 KB
40_pseudostar_04.txt AC 87 ms 19952 KB
40_pseudostar_05.txt AC 87 ms 19824 KB
40_pseudostar_06.txt AC 89 ms 20080 KB
50_line_01.txt AC 434 ms 35244 KB
50_line_02.txt AC 435 ms 35240 KB
50_line_03.txt AC 439 ms 35240 KB
60_max_01.txt AC 373 ms 25684 KB
60_max_02.txt AC 373 ms 23860 KB
60_max_03.txt AC 328 ms 24508 KB
60_max_04.txt AC 354 ms 24244 KB
70_hand_01.txt AC 1 ms 256 KB
70_hand_02.txt AC 1 ms 256 KB
71_hand_01.txt AC 347 ms 25000 KB
72_hand_01.txt AC 450 ms 35244 KB
80_kill2X_01.txt AC 77 ms 15604 KB
80_kill2X_02.txt AC 74 ms 15604 KB
80_kill2X_03.txt AC 74 ms 15604 KB
80_kill2X_04.txt AC 74 ms 15604 KB
80_kill2X_05.txt AC 82 ms 19824 KB
80_kill2X_06.txt AC 81 ms 20080 KB
80_kill2X_07.txt AC 84 ms 20976 KB
80_kill2X_08.txt AC 87 ms 19952 KB