Submission #1353127

#TimeUsernameProblemLanguageResultExecution timeMemory
1353127truongdz_top12Parkovi (COCI22_parkovi)C++20
110 / 110
329 ms30048 KiB
#pragma GCC optimize("O3")
#include<bits/stdc++.h>
#define ll long long
#define all(x) x.begin(), x.end()
#define file(name) freopen(name".inp","r",stdin);freopen(name".out","w",stdout);
using namespace std;
const int MOD = 1e9 + 7;
const int inf = 1e9 + 36;
const ll INF = 1e18 + 36;
const long double EPS = 1e-15;
const int N = 2e5 + 3667;
int minmize(int a, int b) {
    return a < b ? a : b;
}
int maxmize(int a, int b) {
    return a > b ? a : b;
}
ll Minmize(ll a, ll b) {
    return a < b ? a : b;
}
ll Maxmize(ll a, ll b) {
    return a > b ? a : b;
}
int n, k, parent[N];
vector<pair<int, int>>adj[N];
vector<int>order;
ll W;
bool visited[N];
void DFS(int u, int f) {
    for (auto [v, w] : adj[u])
        if (v != f) {
            parent[v] = u;
            DFS(v, u);
        }
    order.push_back(u);
}
pair<ll, vector<int>>check(ll R, bool flag) {
    vector<ll>need(n + 1, 0), cover(n + 1, INF);
    int cnt = 0;
    vector<int>park;
    for (int u : order) {
        need[u] = 0;
        cover[u] = INF;
        for (auto [v, w] : adj[u])
            if (v != parent[u]) {
                if (need[v] != -1) {
                    if (need[v] + w > R) {
                        ++cnt;
                        if (flag)
                            park.push_back(v);
                        cover[u] = Minmize(cover[u], w);
                    }
                    else
                        need[u] = Maxmize(need[u], need[v] + w);
                }
                if (cover[v] != INF) {
                    cover [u] = Minmize(cover[u], cover[v] + w);
                }
            }
        if (need[u] != -1 && cover[u] != INF && need[u] + cover[u] <= R)
            need[u] = -1;
    }
    if (need[1] != -1) {
        ++cnt;
        if (flag)
            park.push_back(1);
    }
    return {cnt, park};
}
int main(){
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    //file("DHKA");
    cin >> n >> k;
    for (int i = 1; i < n; ++i) {
        int u, v, w;
        cin >> u >> v >> w;
        adj[u].push_back({v, w});
        adj[v].push_back({u, w});
        W += w;
    }
    DFS(1, 0);
    ll low = 0, high = W, ans = W;
    while (low <= high) {
        ll mid = (low + high) >> 1LL;
        auto [cnt, park] = check(mid, false);
        if (cnt <= k) {
            ans = mid;
            high = mid - 1;
        }
        else
            low = mid + 1;
    }
    auto [cnt, park] = check(ans, true);
    for (int u : park)
        visited[u] = true;
    for (int u = 1; u <= n && park.size() < k; ++u)
        if (!visited[u])
            park.push_back(u);
    cout << ans << '\n';
    for (int u : park)
        cout << u << ' ';
    return 0;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...