Submission #1246757

#TimeUsernameProblemLanguageResultExecution timeMemory
1246757vht2025Parkovi (COCI22_parkovi)C++20
110 / 110
467 ms31812 KiB
#include <bits/stdc++.h>
using namespace std;

const int N = 200005;

vector<pair<int, int>> adj[N];
bool flag[N], marked[N];
int n, k, cnt;
long long mid;

// DFS trả khoảng cách chính xác như code AC của bạn
long long dfs(int u, int p) {
    if (adj[u].size() == 1 && u != 0) return 0;

    long long mi = LLONG_MAX, ma = LLONG_MIN;
    for (auto [v, w] : adj[u]) {
        if (v == p) continue;
        long long dist = dfs(v, u);

        if (dist == 0 && flag[v]) {
            mi = min(mi, 0LL);
            ma = max(ma, 0LL);
            continue;
        }

        if (dist < 0 && dist + w <= 0)
            flag[u] = 1;

        if (dist < 0 && dist + w > 0)
            dist = 0;
        else
            dist += w;

        if (dist > mid) {
            cnt++;
            marked[v] = 1;
            flag[v] = 1;
            dist = min(-mid + w, 0LL);
            if (-mid + w <= 0) flag[u] = 1;
        }

        ma = max(ma, dist);
        mi = min(mi, dist);
    }

    if (-mi >= ma) return mi;
    return ma;
}

// Check bán kính mid hợp lệ
bool check(long long R) {
    mid = R;
    cnt = 0;
    memset(flag, 0, sizeof(flag));
    memset(marked, 0, sizeof(marked));

    if (dfs(0, -1) > 0 || !flag[0]) {
        marked[0] = 1;
        cnt++;
    }

    return cnt <= k;
}

int main() {
    ios::sync_with_stdio(false); cin.tie(0);
    cin >> n >> k;
    for (int i = 1, u, v, w; i < n; i++) {
        cin >> u >> v >> w;
        u--; v--;
        adj[u].emplace_back(v, w);
        adj[v].emplace_back(u, w);
    }

    long long l = 0, r = (1LL << 60), res = r;
    while (l <= r) {
        long long m = (l + r) / 2;
        if (check(m)) {
            res = m;
            r = m - 1;
        } else l = m + 1;
    }

    // Tìm lại vị trí các node đặt công viên
    check(res);
    vector<int> ans;
    for (int i = 0; i < n; ++i)
        if (marked[i]) ans.push_back(i+1);

    for (int i = 0; ans.size() < k && i < n; ++i)
        if (!marked[i]) ans.push_back(i+1);

    cout << res << "\n";
    for (int x : ans) cout << x << " ";
    cout << "\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...