제출 #979119

#제출 시각아이디문제언어결과실행 시간메모리
979119Mher777도로 폐쇄 (APIO21_roads)C++17
0 / 100
2078 ms19028 KiB
#include "roads.h" #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <iomanip> #include <array> #include <string> #include <algorithm> #include <cmath> #include <set> #include <map> #include <unordered_set> #include <unordered_map> #include <vector> #include <stack> #include <queue> #include <deque> #include <bitset> #include <list> #include <iterator> #include <numeric> #include <complex> #include <utility> #include <random> #include <cassert> #include <fstream> using namespace std; mt19937 rnd(7069); typedef int itn; typedef long long ll; typedef unsigned long long ull; typedef double db; typedef float fl; typedef long double ld; using vi = vector<int>; using vll = vector<ll>; using mii = map<int, int>; using mll = map<ll, ll>; using pii = pair<int, int>; using pll = pair<ll, ll>; #define ff first #define ss second #define pub push_back #define pob pop_back #define puf push_front #define pof pop_front #define mpr make_pair #define yes cout<<"Yes\n" #define no cout<<"No\n" #define all(x) (x).begin(), (x).end() const int dx[8] = { -1, 0, 1, 0, -1, -1, 1, 1 }; const int dy[8] = { 0, -1, 0, 1, -1, 1, -1, 1 }; const int MAX = int(2e9 + 5); const ll MAXL = ll(1e18) + 5ll; const ll MOD = ll(1000000007); const ll MOD2 = ll(998244353); const int N = 100005; vector<pii> g[N]; int dep[N], used[N]; pair<pii, ll> edge[N]; int n; vll minimum_closure_costs(int NX, vi U, vi V, vi W) { n = NX; vll ans(n); for (int i = 0; i < n - 1; ++i) { edge[i] = { {U[i],V[i]},W[i] }; ++dep[U[i]]; ++dep[V[i]]; g[U[i]].pub({ V[i],i }); g[V[i]].pub({ U[i],i}); } for (int k = 0; k <= n - 1; ++k) { multiset<pair<ll, int>> mst; for (int i = 0; i <= n - 1; ++i) { used[i] = 0; dep[i] = (int)g[i].size(); } for (int i = 0; i < n - 1; ++i) { int u = edge[i].ff.ff, v = edge[i].ff.ss; ll w = edge[i].ss; if (dep[u] <= k && dep[v] <= k) continue; if (dep[u] > k && dep[v] > k) { mst.insert({ w,i }); continue; } mst.insert({ w * 2ll,i }); } while (!mst.empty()) { int ind = (*mst.begin()).ss; int u = edge[ind].ff.ff, v = edge[ind].ff.ss; used[ind] = 1; mst.erase(mst.begin()); ans[k] += edge[ind].ss; for (auto to : g[u]) { if (used[to.ss]) continue; if (dep[u] > k && dep[to.ff] > k) { mst.erase({ edge[to.ss].ss, to.ss }); continue; } mst.erase({ edge[to.ss].ss * 2ll, to.ss }); } for (auto to : g[v]) { if (used[to.ss]) continue; if (dep[v] > k && dep[to.ff] > k) { mst.erase({ edge[to.ss].ss, to.ss }); continue; } mst.erase({ edge[to.ss].ss * 2ll, to.ss }); } --dep[u], --dep[v]; for (auto to : g[u]) { if (used[to.ss]) continue; if (dep[u] <= k && dep[to.ff] <= k) continue; if (dep[u] > k && dep[to.ff] > k) { mst.insert({ edge[to.ss].ss, to.ss }); continue; } mst.insert({ edge[to.ss].ss * 2ll, to.ss }); } for (auto to : g[v]) { if (used[to.ss]) continue; if (dep[v] <= k && dep[to.ff] <= k) continue; if (dep[v] > k && dep[to.ff] > k) { mst.insert({ edge[to.ss].ss, to.ss }); continue; } mst.insert({ edge[to.ss].ss * 2ll, to.ss }); } } } return ans; } /* 5 0 1 1 0 2 4 0 3 3 2 4 2 4 0 1 5 2 0 10 0 3 5 */
#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...