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
AC × 3
AC × 31
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