Submission #51888815
Source Code Expand
#include <bits/stdc++.h>
using namespace std;
using i64 = int64_t;
int main() {
// in
int n;
cin >> n;
vector<int> a(n - 1), b(n - 1);
vector<vector<int>> tree(n);
for (int i = 0; i < n - 1; ++i) {
cin >> a[i] >> b[i];
--a[i], --b[i];
tree[a[i]].push_back(b[i]);
tree[b[i]].push_back(a[i]);
}
vector<i64> c(n);
for (auto &e : c) {
cin >> e;
}
// solve
const i64 sum_c = accumulate(c.begin(), c.end(), 0ll);
const int root = 0;
// subtree_sum[i] : sum c[x] (x in subtree(i))
vector<i64> subtree_sum(n);
auto dfs = [&](auto &&self, const int v, const int par) -> i64 {
subtree_sum[v] = c[v];
for (const int to : tree[v]) {
if (to == par) {
continue;
}
subtree_sum[v] += self(self, to, v);
}
return subtree_sum[v];
};
dfs(dfs, root, -1);
auto find_centroid = [&](auto &&self, const int v, const int par) -> int {
bool is_centroid = true;
for (const int to : tree[v]) {
if (to == par) {
continue;
}
const int res = self(self, to, v);
if (res != -1) {
return res;
}
if (subtree_sum[to] > sum_c / 2) {
is_centroid = false;
}
}
if ((sum_c - subtree_sum[v]) > sum_c / 2) {
is_centroid = false;
}
return is_centroid ? v : -1;
};
const int centroid = find_centroid(find_centroid, root, -1);
// dist[i] : d(centroid, i)
vector<int> dist(n);
auto calc_dist = [&](auto &&self, const int v, const int par, const int d) -> void {
dist[v] = d;
for (const int to : tree[v]) {
if (to == par) {
continue;
}
self(self, to, v, d + 1);
}
};
calc_dist(calc_dist, centroid, -1, 0);
// out
i64 ans = 0;
for (int i = 0; i < n; ++i) {
ans += dist[i] * c[i];
}
cout << ans << endl;
}
Submission Info
| Submission Time |
|
| Task |
E - Minimize Sum of Distances |
| User |
Cyanmond |
| Language |
C++ 20 (gcc 12.2) |
| Score |
100 |
| Code Size |
2174 Byte |
| Status |
AC |
| Exec Time |
87 ms |
| Memory |
14940 KiB |
Judge Result
| Set Name |
Sample |
All |
| Score / Max Score |
0 / 0 |
100 / 100 |
| Status |
|
|
| Set Name |
Test Cases |
| Sample |
example0.txt, example1.txt, example2.txt |
| All |
example0.txt, example1.txt, example2.txt, test_00.txt, test_01.txt, test_02.txt, test_03.txt, test_04.txt, test_05.txt, test_06.txt, test_07.txt, test_08.txt, test_09.txt, test_10.txt, test_11.txt, test_12.txt, test_13.txt, test_14.txt, test_15.txt, test_16.txt, test_17.txt, test_18.txt, test_19.txt, test_20.txt, test_21.txt, test_22.txt, test_23.txt, test_24.txt, test_25.txt, test_26.txt, test_27.txt |
| Case Name |
Status |
Exec Time |
Memory |
| example0.txt |
AC |
1 ms |
3360 KiB |
| example1.txt |
AC |
1 ms |
3364 KiB |
| example2.txt |
AC |
1 ms |
3516 KiB |
| test_00.txt |
AC |
51 ms |
8368 KiB |
| test_01.txt |
AC |
34 ms |
6532 KiB |
| test_02.txt |
AC |
60 ms |
9092 KiB |
| test_03.txt |
AC |
13 ms |
4804 KiB |
| test_04.txt |
AC |
50 ms |
9440 KiB |
| test_05.txt |
AC |
29 ms |
6844 KiB |
| test_06.txt |
AC |
38 ms |
8064 KiB |
| test_07.txt |
AC |
36 ms |
8156 KiB |
| test_08.txt |
AC |
28 ms |
6788 KiB |
| test_09.txt |
AC |
80 ms |
11308 KiB |
| test_10.txt |
AC |
64 ms |
11328 KiB |
| test_11.txt |
AC |
80 ms |
11356 KiB |
| test_12.txt |
AC |
65 ms |
11236 KiB |
| test_13.txt |
AC |
82 ms |
11432 KiB |
| test_14.txt |
AC |
65 ms |
11332 KiB |
| test_15.txt |
AC |
66 ms |
11872 KiB |
| test_16.txt |
AC |
51 ms |
11888 KiB |
| test_17.txt |
AC |
67 ms |
11868 KiB |
| test_18.txt |
AC |
50 ms |
11828 KiB |
| test_19.txt |
AC |
67 ms |
11744 KiB |
| test_20.txt |
AC |
50 ms |
11832 KiB |
| test_21.txt |
AC |
87 ms |
14940 KiB |
| test_22.txt |
AC |
70 ms |
14904 KiB |
| test_23.txt |
AC |
87 ms |
14224 KiB |
| test_24.txt |
AC |
72 ms |
13576 KiB |
| test_25.txt |
AC |
86 ms |
14128 KiB |
| test_26.txt |
AC |
71 ms |
14408 KiB |
| test_27.txt |
AC |
1 ms |
3416 KiB |