Submission #1162501

#TimeUsernameProblemLanguageResultExecution timeMemory
1162501tw20000807Road Closures (APIO21_roads)C++20
24 / 100
2096 ms24392 KiB
#include "roads.h"
#include<bits/stdc++.h>
using namespace std;

vector<long long> minimum_closure_costs(int n, vector<int> u,  vector<int> v, vector<int> w){

    #define all(v) v.begin(), v.end()
    #define int long long
    #define pii pair<int, int>
    #define X first
    #define Y second
    #define SZ(s) ((int)s.size())

    vector< vector< pii > > g(n);
    vector< int > ans(n);
    for(int i = 0; i < n - 1; ++i){
        g[u[i]].push_back({v[i], w[i]});
        g[v[i]].push_back({u[i], w[i]});
        ans[0] += w[i];
    }

    for(int k = 1; k < n; ++k){
        vector< array<int, 2> > dp(n);
        auto dfs = [&](auto dfs, int cur, int par, int d = 0) -> void {
            dp[cur][0] = 0;
            dp[cur][1] = d;

            vector< int > t;

            for(auto &[k, w] : g[cur]) if(k != par) {
                dfs(dfs, k, cur, w);
                dp[cur][0] += dp[k][0];
                dp[cur][1] += dp[k][0];
                t.push_back(max(dp[k][1] - dp[k][0], 0LL));
            }

            sort(all(t), greater< int >());

            for(int i = 0; i < min(k, SZ(t)); ++i){
                dp[cur][0] += t[i];
                if(i < k - 1) dp[cur][1] += t[i];
            }

        };
        dfs(dfs, 0, 0);
        ans[k] = ans[0] - dp[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...