Submission #1353138

#TimeUsernameProblemLanguageResultExecution timeMemory
1353138phongdnhParkovi (COCI22_parkovi)C++20
110 / 110
521 ms35228 KiB
#include <bits/stdc++.h>
using namespace std;
#define F first
#define S second
#define pb push_back
#define pii pair<ll,ll>
#define ll long long
#define FOR(i,a,b) for( ll i = a ; i <= b ; i++ )
#define REP(i,a,b) for( ll i = a ; i >= b ; i-- )
const ll maxn = 200009;
ll n , k;
vector<pii> a[maxn];
ll need[maxn] , cover[maxn];
const ll INF = 1e18;
ll cnt;
bool park[maxn];


//void init(){
//    cnt = 0;
//    FOR(i,1,n){
//        park[i] = 0;
//        need[i] = 0;
//        cover[i] = INF;
//    }
//}
ll R;
void dfs( ll u , ll par ){
    need[u] = 0;
    cover[u] = INF;
    for( auto [v,w] : a[u] ){
        if( v == par ) continue;
        dfs(v,u);
        if( need[v] != -1 ){
            if( need[v] + w > R ){
                /// dat cong vien tai v
                cnt++;
                park[v] = 1;
                cover[u] = min( cover[u] , 0LL+w );
            }
            else{
                need[u] = max( need[u] , need[v] + w );
            }
        }
        if( cover[v] != INF ){
            cover[u] = min( cover[u] , cover[v] + w );

        }

    }
    if( need[u] != -1 && cover[u] != INF && ( need[u] + cover[u] ) <= R )
        need[u] = -1;
//    cout << "w";
}




bool chec( ll mid ){
//    init();
    R = mid;
    cnt = 0;
    fill(park+1,park+1+n,0);
    dfs(1,0);
    if( need[1] != -1 ){
        cnt++;
        park[1] = 1;
    }
    if( cnt < k ){
        int cur = 1;
        int tim = k-cnt;
        while(tim != 0){
            if( park[cur] == 0 ){
                park[cur] = 1;
                tim--;
            }
            cur++;

        }

    }
    return (cnt <= k);
}


signed main(){
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
//    freopen( "name.inp" , "r" , stdin );
//    freopen( "name.out" , "w" , stdout );
    ll l = 0 , r = 0;
    cin >> n >> k;
    FOR(i,1,n-1){
        ll u , v , w;
        cin >> u >> v >> w;
        a[u].pb({v,w});
        a[v].pb({u,w});
        r += w;
    }
    while( l < r ){
        ll mid = (l+r)/2;
        if( chec(mid) )
            r = mid;
        else l = mid+1;

    }
    chec(r);
    vector<ll> ans;
    FOR(i,1,n)
        if( park[i] == 1 )
            ans.pb(i);
    cout << r << '\n';
    FOR(i,0,(ll)ans.size()-1)
        cout << ans[i] << " ";
//    cout << ans[ans.size()-1];
    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...