Submission #1353135

#TimeUsernameProblemLanguageResultExecution timeMemory
1353135tdd209Parkovi (COCI22_parkovi)C++20
20 / 110
174 ms38980 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define fti(i, x, y) for (int i = x; i <= y; ++i)
#define ftd(i, x, y) for (int i = x; i >= y; --i)

const int MA = 2e5 + 5;
const ll oo = 1e18 + 1;

int n, k, ans, c = 0;
ll d[MA], da[MA], db[MA], mi = 1e18, f[MA], L, R, need[MA], cover[MA];
bool s3 = 1;
bool sett[MA];
vector <pair <int, ll>> con[MA];
vector <int> res;

void sub1()
{
    int M = (1 << n) - 1;
    fti(m, 1, M)
    {
        if (__builtin_popcount(m) != k) continue;
        queue <int> q;
        vector <int> t;
        fti(i, 1, n) d[i] = 1e18;
        fti(i, 1, n)
            if ((m >> (i - 1)) & 1)
                t.push_back(i), q.push(i), d[i] = 0;
        while (!q.empty())
        {
            int u = q.front(); q.pop();
            for (auto [v, w] : con[u])
                if (d[v] > d[u] + w)
                    d[v] = d[u] + w, q.push(v);
        }
        ll ma = *max_element(d + 1, d + 1 + n);
        if (ma < mi)
            mi = ma, res = t;
    }
    cout << mi << '\n';
    for (int u : res) cout << u << (u == res.back() ? "" : " ");
}

void dfs(int u, int p, ll d[])
{
    for (auto [v, w] : con[u])
        if (v != p)
        {
            d[v] = d[u] + w; dfs(v, u, d);
        }
}

void sub2()
{
    dfs(1, 0, d);
    int a = max_element(d + 1, d + 1 + n) - d;
    dfs(a, 0, da);
    int b = max_element(da + 1, da + 1 + n) - da;
    dfs(b, 0, db);
    fti(i, 1, n)
    {
        ll mx = max(da[i], db[i]);
        if (mx < mi)
            mi = mx, ans = i;
    }
    cout << mi << '\n' << ans;
}

void dfs1(int u, int p, ll x)
{
    need[u] = 0, cover[u] = oo;
    for (auto [v, w] : con[u])
    {
        if (v == p) continue;
        dfs1(v, u, x);
        if (need[v] != -1)
        {
            if (need[v] + w > x)
            {
                ++c; sett[v] = 1; need[v] = -1;
                cover[u] = min(cover[u], w);
            }
            else
                need[u] = max(need[u], need[v] + w);
        }
        if (cover[v] != oo)
            cover[u] = min(cover[u], cover[v] + w);
    }
    if (need[u] != -1 && cover[u] != oo && need[u] + cover[u] <= x)
        need[u] = -1;
}

bool chek(ll x)
{
    c = 0;
    fti(i, 1, n) sett[i] = need[i] = 0, cover[i] = oo;
    dfs1(1, 0, x);
    if (need[1] != -1)
    {
        ++c; sett[1] = 1;
    }
    return (c <= k);
}

void sub4()
{
    L = 0, R = accumulate(f + 1, f + n, 0LL);
    while (L < R)
    {
        ll mid = (L + R) / 2;
        if (chek(mid))
            R = mid;
        else
            L = mid + 1;
    }
    chek(R);
    fti(i, 1, n)
        if (sett[i]) res.push_back(i);
//    if (c <= k)
//    {
//        int cc = c, it = 1;
//        while (it <= n && cc <= k)
//        {
//            if (!sett[it])
//            {
//                res.push_back(it); ++cc;
//            }
//            ++it;
//        }
//    }
    cout << R << '\n';
    for (int u : res) cout << u << ' ';
}


int main()
{
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
//    freopen("park.inp", "r", stdin);
//    freopen("park.out", "w", stdout);
    cin >> n >> k;
    fti(i, 2, n)
    {
        int u, v; ll w; cin >> u >> v >> w;
        f[i - 1] = w;
        con[u].push_back({v, w});
        con[v].push_back({u, w});
    }
    if (n <= 20)
        sub1();
    else if (k == 1)
        sub2();
    else
        sub4();
    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...