Submission #1356687

#TimeUsernameProblemLanguageResultExecution timeMemory
1356687Desh03Road Closures (APIO21_roads)C++20
36 / 100
2093 ms27696 KiB
#include <bits/stdc++.h>

using namespace std;

vector<long long> minimum_closure_costs(int n, vector<int> u, vector<int> v, vector<int> w) {
    vector<vector<pair<int, int>>> g(n);
    bool st = 1, ln = 1;
    for (int i = 0; i + 1 < n; i++) {
        g[u[i]].push_back({v[i], w[i]});
        g[v[i]].push_back({u[i], w[i]});
        if (u[i] && v[i]) st = 0;
        if (u[i] != i || v[i] != i + 1) ln = 0;
    }
    vector<long long> ans(n);
    if (st) {
        vector<long long> v;
        for (auto [x, y] : g[0]) {
            v.push_back(y);
        }
        sort(v.begin(), v.end());
        for (int i = n - 2; i >= 0; i--) {
            ans[i] = ans[i + 1] + v[n - i - 2];
        }
        return ans;
    }
    ans[0] = accumulate(w.begin(), w.end(), 0LL);
    for (int k = 1; k < (ln ? min(2, n - 1) : n - 1); k++) {
        vector<long long> dp0(n), dp1(n);
        auto dfs = [&](const auto &dfs, int u) -> void {
            vector<long long> del;
            for (auto [v, w] : g[u]) {
                if (k == 1) g[v].erase(find(g[v].begin(), g[v].end(), make_pair(u, w)));
                dfs(dfs, v);
                del.push_back(dp1[v] - dp0[v] + w);
                dp0[u] += dp0[v];
                dp1[u] += dp0[v];
            }
            sort(del.begin(), del.end());
            int cnt = 0;
            for (auto x : del) {
                if (x <= 0) {
                    dp0[u] += x;
                    dp1[u] += x;
                    cnt++;
                } else {
                    break;
                }
            }
            for (int i = cnt; i < (int) g[u].size() - k + 1; i++) {
                dp0[u] += del[i];
            }
            for (int i = cnt; i < (int) g[u].size() - k; i++) {
                dp1[u] += del[i];
            }
        };
        dfs(dfs, 0);
        ans[k] = dp1[0];
    }
    return ans;
}
#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...