Submission #533586

#TimeUsernameProblemLanguageResultExecution timeMemory
5335861binRoad Closures (APIO21_roads)C++14
31 / 100
2087 ms55356 KiB
#include <bits/stdc++.h> using namespace std; #define all(v) v.begin(), v.end() typedef long long ll; const int NMAX = 1e5 + 5; set<pair<ll, ll>> adj[NMAX]; int dg[NMAX], vis[NMAX]; ll dp[NMAX][2], S[NMAX]; vector<int> D[NMAX]; set<int> X; multiset<ll> C[NMAX]; void dfs(int now, int k) { vis[now] = 1; ll& ret = dp[now][0] = S[now]; vector<ll> tmp; for(auto& p : adj[now]) { ll nx = p.first, w = p.second; if(vis[nx]) continue; dfs(nx, k); ret += dp[nx][0] + w; ll t = dp[nx][1] - dp[nx][0] - w; C[now].emplace(t); tmp.emplace_back(t); } auto it = C[now].begin(); for(int i = 0; i < k - 1; i++) ret += min(*it++, 0LL); dp[now][1] = ret; ret += min(*it, 0LL); //cout << "Now is : " << now << '\n'; //for(ll x : C[now]) cout << x << ' '; //cout << '\n'; for(ll t : tmp) C[now].erase(C[now].find(t)); return; } vector<ll> minimum_closure_costs (int N, vector<int> U, vector<int> V, vector<int> W) { vector<ll> ans(N, 0); for(int i = 0; i < N - 1; i++) { adj[U[i]].emplace(V[i], W[i]); adj[V[i]].emplace(U[i], W[i]); dg[U[i]]++; dg[V[i]]++; ans[0] += W[i]; } for(int i = 0; i < N; i++) { D[dg[i]].emplace_back(i); X.emplace(i); } for(int k = 1; k < N; k++) { // 노드 삭제하기 //cout << "NOW TURN IS : " << k << '\n'; for(int x : D[k]) { X.erase(x); //cout << "erase : " << x << '\n'; for(auto& p : adj[x]) { ll nx = p.first, w = p.second; adj[nx].erase({ x, w }); S[nx] += w; C[nx].emplace(-w); } } // 각 트리에 대해서 탐색 for(int x : X) if(!vis[x]) { dfs(x, k); ans[k] += dp[x][0]; } for(int x : X) vis[x] = 0; } return ans; } // //int main(void) { // ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); // // freopen("input.txt", "r", stdin); // int N; // cin >> N; // vector<int> U(N), V(N), W(N); // for(int i = 0; i < N - 1; i++) cin >> U[i] >> V[i] >> W[i]; // vector<ll> ans = minimum_closure_costs(N, U, V, W); // for(int i = 0; i < N; i++) cout << ans[i] << ' '; // return 0; //}
#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...