Submission #1350484

#TimeUsernameProblemLanguageResultExecution timeMemory
1350484SulARoad Closures (APIO21_roads)C++20
24 / 100
155 ms63396 KiB
#include <bits/stdc++.h>
using namespace std;

const int N = 2000;
vector<pair<int,int>> adj[N];
long long dp[N][N][2];

void dfs(int u, int p = -1) {
    for (auto [v, w] : adj[u]) if (v != p) {
        dfs(v, u);
    }
    for (auto [v, w] : adj[u]) if (v != p) {
        dp[0][u][0] += w + dp[0][v][0];
    }
    for (int k = 1; k < N; k++) {
        vector<long long> difs;
        for (auto [v, w] : adj[u]) if (v != p) {
            dp[k][u][0] += w + dp[k][v][0];
            difs.emplace_back(dp[k][v][1] - (w + dp[k][v][0]));
        }
        dp[k][u][1] = dp[k][u][0];
        ranges::sort(difs);
        for (int i = 0; i < k && i < difs.size(); i++) {
            dp[k][u][0] += min(0ll, difs[i]);
            if (i < k-1)
                dp[k][u][1] += min(0ll, difs[i]);
        }
    }
//    for (int k = 0; k < 5; k++)
//        cout << u << " " << k << " " << dp[k][u] << "\n";
}

vector<long long> minimum_closure_costs(int n, vector<int> u, vector<int> v, vector<int> w) {
    for (int i = 0; i < n-1; i++) {
        adj[u[i]].emplace_back(v[i], w[i]);
        adj[v[i]].emplace_back(u[i], w[i]);
    }
    dfs(0);
    vector<long long> ans(n);
    for (int i = 0; i < n; i++)
        ans[i] = dp[i][0][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...