Submission #1345189

#TimeUsernameProblemLanguageResultExecution timeMemory
1345189nagorn_phRoad Closures (APIO21_roads)C++20
24 / 100
2096 ms23156 KiB
#include "roads.h"
#include <bits/stdc++.h>
#define int long long
#define emb emplace_back
#define pii pair <int32_t, int32_t>
#define tiii tuple <int32_t, int32_t, int32_t>
#define all(a) a.begin(), a.end()

using namespace std;

const int N = 1e5 + 5;
const int inf = 1e18;

int32_t n;
vector <pii> adj[N];
int dp[N][2]; // dp[i] = min cost for subtree i and (have/not have) edge (i, p[i])
int k = 0;

void dfs(int u, int p){
    vector <int> del;
    int cur = 0;
    int pw = 0;
    for (auto [w, v] : adj[u]) {
        if (v == p) {
            pw = w;
            continue;
        }
        dfs(v, u);
        del.emb(dp[v][1] - dp[v][0]);
        cur += dp[v][0];
    }
    sort(all(del));
    if (k == 1) dp[u][1] = cur;
    for (int i = 0; i < del.size(); i++) {
        if (del[i] > 0) break;
        cur += del[i];
        if (i+1 == k) dp[u][0] = cur + pw;
        if (i+1 == k - 1) dp[u][1] = cur;
    }
    if (dp[u][0] == inf) dp[u][0] = cur + pw;
    if (dp[u][1] == inf) dp[u][1] = cur;
}

std::vector<long long> minimum_closure_costs(int32_t N, std::vector<int32_t> u,
                                             std::vector<int32_t> v,
                                             std::vector<int32_t> w) {
    n = N;
    vector <int> l(n + 1), r(n + 1);
    for (int32_t i = 0; i < n - 1; i++) {
        u[i]++, v[i]++;
        adj[u[i]].emb(w[i], v[i]);
        adj[v[i]].emb(w[i], u[i]);
        r[min(u[i], v[i])] = w[i];
        l[max(u[i], v[i])] = w[i];
    }
    vector <int> ans(n);
    ans[0] = accumulate(all(w), 0ll);
    for (k = 1; k < n; k++) {
        for (int i = 1; i <= n; i++) dp[i][0] = dp[i][1] = inf;
        dfs(1, 1);
        ans[k] = dp[1][0];
        // cout << k << " : \n";
        // for (int i = 1; i <= n; i++) {
        //     cout << i << " : " << dp[i][0] << ", " << dp[i][1] << "\n";
        // }
        // cout << "-----------------\n";
    }
    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...