Submission #533524

#TimeUsernameProblemLanguageResultExecution timeMemory
533524VimmerParkovi (COCI22_parkovi)C++14
110 / 110
2085 ms46348 KiB
#include <bits/stdc++.h> #define in(x) freopen(x, "r", stdin) #define out(x) freopen(x, "w", stdout) //#pragma GCC optimize("Ofast") //#pragma GCC optimize("unroll-loops") //#pragma GCC optimize("-O3") #define F first #define S second #define PB push_back #define M ll(1e9 + 7) #define sz(x) int(x.size()) #define N 200005 #define pri(x) cout << x << endl //#define endl '\n' #define all(x) (x).begin(), (x).end() #define _ << " " << using namespace std; //typedef tree <ll, null_type, less_equal <ll> , rb_tree_tag, tree_order_statistics_node_update> ordered_set; //using namespace __gnu_pbds; typedef long long ll; typedef long double ld; typedef short int si; typedef unsigned long long ull; int n, k; vector <pair <int, int> > g[N]; bool go; ll md; int ost; bool cmp(pair <ll, ll> x, pair <ll, ll> y) { return x.S < y.S; } set <int> ans; pair <ll, ll> dfs(int v, int p, ll dst) { ll mx = 0; ll when = 1e18; vector <pair <ll, ll> > vr; vr.clear(); for (auto it : g[v]) { if (it.F == p) continue; pair <ll, ll> vl = dfs(it.F, v, it.S); vr.PB(vl); } sort(all(vr), cmp); for (int i = 0; i < sz(vr); i++) { if (vr[0].S + vr[i].F > md) mx = max(mx, vr[i].F); } if (sz(vr)) when = vr[0].S; // pri(v _ mx _ when _ ost _ dst); if (mx + dst > md && (mx != 0 || when > md)) { if (go) ans.insert(v); ost--; when = 0; mx = 0; } if (v == 1 && (mx != 0 || when > md)) { ost--; return {mx, when}; } // pri(v _ mx _ when _ ost _ dst); mx += dst; if (mx == dst && when <= md) mx = 0; if (when != 1e18) when += dst; if (when > md) when = 1e18; return {mx, when}; } int main() { istream::sync_with_stdio(0); ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); // freopen("1.in", "r", stdin); cin >> n >> k; for (int i = 1; i < n; i++) { int x, y, w; cin >> x >> y >> w; g[x].PB({y, w}); g[y].PB({x, w}); } ll l = 1, r = 1e18; while (l < r) { md = (l + r) / 2; ost = k; dfs(1, -1, 0); if (ost >= 0) r = md; else l = md + 1; } md = l; go = 1; dfs(1, -1, 0); pri(l); int i = 1; while (sz(ans) < k) { ans.insert(i++); } for (auto it : ans) cout << it << " "; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...