Submission #1353134

#TimeUsernameProblemLanguageResultExecution timeMemory
1353134abcd_4321Parkovi (COCI22_parkovi)C++20
110 / 110
487 ms33924 KiB
#pragma GCC optimize("O3")
#include <bits/stdc++.h>
#define file(name) freopen(name".inp", "r", stdin);freopen(name".out", "w", stdout);
#define ll long long
#define all(x) x.begin(),x.end()
using namespace std;
const int N=2e5+5;
int n, k, cur;
ll fu[N], nanh[N];
bool park[N];
vector <pair<int, int>> G[N];
void dfs(int u, int p, ll d){
    for (auto [v, w]:G[u]){
        if (v==p)continue;
        dfs(v, u, d);
        if (fu[v]!=-1){
            if (fu[v]+w>d){
                ++cur;
                nanh[u]=min(nanh[u], (ll)w);
            }
            else fu[u]=max(fu[u], fu[v]+w);
        }
        if (nanh[v]<1e18)nanh[u]=min(nanh[u], nanh[v]+w);
    }
    if (fu[u]!=-1 && nanh[u]<1e18 && fu[u]+nanh[u]<=d)fu[u]=-1;
}
void dfs2(int u, int p, ll d){
    for (auto [v, w]:G[u]){
        if (v==p)continue;
        dfs2(v, u, d);
        if (fu[v]!=-1){
            if (fu[v]+w>d){
                park[v]=1;
                nanh[u]=min(nanh[u], (ll)w);
            }
            else fu[u]=max(fu[u], fu[v]+w);
        }
        if (nanh[v]<1e18)nanh[u]=min(nanh[u], nanh[v]+w);
    }
    if (fu[u]!=-1 && nanh[u]<1e18 && fu[u]+nanh[u]<=d)fu[u]=-1;
}
bool okiee(ll d){
    memset(nanh, 0x3f, sizeof nanh);
    memset(fu, 0, sizeof fu);
    cur=0;
    dfs(1, 1, d);
    if (fu[1]!=-1)++cur;
    return cur<=k;
}
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>k;
    ll l=2e14, r=l;
    for (int i=1;i<n;++i){
        int u, v, w;
        cin>>u>>v>>w;
        G[u].push_back({v, w});
        G[v].push_back({u, w});
        l=min(l, (ll)w);
    }
    ll res=0;
    while (l<=r){
        ll mid=l+r>>1;
        if (okiee(mid)){
            res=mid;
            r=mid-1;
        }
        else l=mid+1;
    }
    cout<<res<<"\n";
    memset(nanh, 0x3f, sizeof nanh);
    memset(fu, 0, sizeof fu);
    dfs2(1, 1, res);
    if (fu[1]!=-1)park[1]=1;
    int cnt=0;
    for (int i=1;i<=n;++i)
        if (park[i]){
            cout<<i<<" ";
            ++cnt;
        }
    for (int i=1;i<=n;++i){
        if (cnt==k)break;
        if (!park[i]){
            cout<<i<<" ";
            ++cnt;
        }
    }
    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...