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 |
|
|
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 |