Submission #1111660

#TimeUsernameProblemLanguageResultExecution timeMemory
1111660vako_pParkovi (COCI22_parkovi)C++14
110 / 110
631 ms110408 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define pb push_back const int mxN = 1e6 + 5; ll n,k,dis[mxN],dis1[mxN],d[mxN],cnt[mxN],mid; vector<pair<ll,ll>> v[mxN]; vector<pair<ll,ll>> vv[mxN]; bool vis[mxN]; void dfs(ll at, ll par){ for(auto it : v[at]){ if(it.first == par) continue; dfs(it.first, at); dis[at] = max(dis[at], dis[it.first] + it.second); } } void dfs1(ll at, ll par){ if(dis[at] <= mid){ dis1[at] = dis[at]; d[at] = mid; cnt[at] = 1; vis[at] = true; for(auto it : v[at]){ if(it.first == par) continue; vis[it.first] = false; } // cout << "dis[at] <= mid" << at << ' ' << cnt[at] << ' ' << ' ' << d[at] << ' ' << dis1[at] << '\n'; return; } vv[at].clear(); ll c = 1,dd = 0,dd1 = 0,dd2 = 0; bool ok = true; for(auto it : v[at]){ if(it.first == par) continue; dfs1(it.first, at); d[it.first] -= it.second; if(d[it.first] >= 0) ok = false; dis1[it.first] += it.second; c += cnt[it.first] - (dis1[it.first] <= mid); dd2 = max(dd2, dis1[it.first]); if(dis1[it.first] <= mid){ vv[at].pb({dis1[it.first], it.first}); dd1 = max(dd1, dis1[it.first]); vis[it.first] = false; } else dd = max(dd, d[it.first]); } if(ok){ cnt[at] = c; d[at] = mid; dis1[at] = dd1; vis[at] = true; // cout << "did not reach node" << at << ' ' << cnt[at] << ' ' << ' ' << d[at] << ' ' << dis1[at] << '\n'; return; } sort(vv[at].begin(), vv[at].end()); for(auto it : vv[at]){ if(dd < it.first){ cnt[at] = c; d[at] = mid; dis1[at] = dd1; vis[at] = true; // cout << "did not work without node" << at << ' ' << cnt[at] << ' ' << ' ' << d[at] << ' ' << dis1[at] << '\n'; return; } } cnt[at] = c - 1; d[at] = dd; dis1[at] = dd2; // cout << "worked without node" << at << ' ' << cnt[at] << ' ' << ' ' << d[at] << ' ' << dis1[at] << '\n'; } bool ok(){ for(int i = 0; i <= n; i++){ vis[i] = false; dis1[i] = d[i] = cnt[i] = 0; } dfs1(1, 1); return (cnt[1] <= k); } int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n >> k; for(int i = 0; i < n - 1; i++){ ll a,b,w; cin >> a >> b >> w; v[a].pb({b, w}); v[b].pb({a, w}); } dfs(1, 1); ll l = -1, r = 1e16; while(r > l + 1){ mid = l + (r - l) / 2; if(ok()) r = mid; else l = mid; } // r = 1135814621; cout << r << '\n'; mid = r; ok(); ll cc = k; for(int i = 1; i <= n; i++){ if(vis[i]){ cout << i << ' '; cc--; assert(cc >= 0); } } for(int i = 1; i <= n and cc > 0; i++){ if(!vis[i]){ cout << i << ' '; cc--; } } 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...