제출 #1353129

#제출 시각아이디문제언어결과실행 시간메모리
1353129phongdnhParkovi (COCI22_parkovi)C++20
10 / 110
496 ms31380 KiB
#include <bits/stdc++.h>
using namespace std;
#define F first
#define S second
#define pb push_back
#define pii pair<int,int>
#define ll long long
#define FOR(i,a,b) for( int i = a ; i <= b ; i++ )
#define REP(i,a,b) for( int i = a ; i >= b ; i-- )
const int maxn = 200009;
int n , k;
vector<pii> a[maxn];
ll need[maxn] , cover[maxn];
const ll INF = 1e18;
int 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( int u , int 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;
    }
    return (cnt <= k);
}


int 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){
        int 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<int> ans;
    FOR(i,1,n)
        if( park[i] == 1 )
            ans.pb(i);
    cout << r << '\n';
    FOR(i,0,(int)ans.size()-1)
        cout << ans[i] << " ";
//    cout << ans[ans.size()-1];
    return 0;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…