Submission #1164577

#TimeUsernameProblemLanguageResultExecution timeMemory
1164577tw20000807Road Closures (APIO21_roads)C++20
0 / 100
192 ms17756 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]});
    }
	vector< int > ord(n);
	iota(all(ord), 0);
	sort(all(ord), [&](int a, int b){
		return SZ(g[a]) > SZ(g[b]);
	});

    for(int k = 0; k < n; ++k){
		map<int, int> vis;
        auto dfs = [&](auto dfs, int cur, int par, int d = 0) -> int {
			vis[cur] = 1;
            int ret = SZ(g[cur]) - k;
            for(auto &[nxt, w] : g[cur]) if(!vis[nxt] && SZ(g[nxt]) > k) {
                ret -= dfs(dfs, nxt, cur, w);
            }
            ans[k] += ret;
			if(cur != par && ret > 0){
				return 1;
			}
            return 0;
        };
        for(auto &id : ord){
			if(SZ(g[id]) <= k) break;
			if(!vis[id]) dfs(dfs, id, id);
		}
    }
    return ans;
}
/*
5
0 1 1
0 2 1
0 3 1
0 4 1
*/
#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...