Submission #1164590

#TimeUsernameProblemLanguageResultExecution timeMemory
1164590tw20000807Road Closures (APIO21_roads)C++20
0 / 100
2094 ms13968 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 i = 0; i < n; ++i){
        sort(all(g[i]), [&](pii a, pii b){
            return SZ(g[a.X]) > SZ(g[b.X]);
        });
    }
    vector< int > take(n), vis(n);
    for(int k = 0; k < n; ++k){
        for(auto &id : ord){
            if(SZ(g[id]) <= k) break;
            take[id] = SZ(g[id]) - k;
            vis[id] = 0;
        }
        auto dfs = [&](auto dfs, int cur, int par, int d = 0) -> void {
			vis[cur] = 1;
            for(auto &[nxt, w] : g[cur]) if(!vis[nxt]) {
                if(SZ(g[nxt]) <= k) break;
                dfs(dfs, nxt, cur, w);
                if(take[nxt] && take[cur]){
                    --take[nxt];
                    --take[cur];
                    ++ans[k];
                }
            }
        };
        for(auto &id : ord){
			if(SZ(g[id]) <= k) break;
			if(!vis[id]) dfs(dfs, id, id);
            ans[k] += take[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...