제출 #1353102

#제출 시각아이디문제언어결과실행 시간메모리
1353102whtthParkovi (COCI22_parkovi)C++20
110 / 110
487 ms46136 KiB
#pragma GCC optimize("O3")
#include <bits/stdc++.h>
using namespace std;
int n, k, x, y, w, t = 0;
bool ok[200001];
long long cnt, d[200001], need[200001], cover[200001], S;
vector<pair<int, int>> ke[200001];
vector<pair<long long, int>> a;
vector<int> ans;
vector<int> trace;
void dfs(int u, int p){
    need[u]=0;
    cover[u]=1e18;
    for(auto [v, w] : ke[u]){
        if(v==p)continue;
        dfs(v, u);
        if(need[v]!=-1){
            if(need[v]+w>S){
                trace.push_back(v);
                cover[u]=min(cover[u], 1LL*w);
            }
            else {
                need[u]=max(need[u], need[v]+w);
            }
        }
        if(cover[v]!=1e18){
            cover[u]=min(cover[u], cover[v]+w);
        }
    }
    if(need[u]+cover[u]<=S)need[u]=-1;
}
bool check(long long pp){
    trace.clear();
    S=pp;
    dfs(1, 0);
    if(need[1]!=-1)trace.push_back(1);
    if(trace.size()<=k){
        ans=trace;
        return true;
    }
    return false;
}
int main(){
    ios::sync_with_stdio(0);cin.tie(nullptr);
    cin >> n >> k;
    for(int i = 1; i < n; i++){
        cin >> x >> y >> w;
        ke[x].push_back({y, w});
        ke[y].push_back({x, w});
    }
    dfs(1, 0);
    long long vt=-1, l=1, r=2e14, mid;
    while(l <= r){
        mid = (l + r) / 2;
        if(check(mid)){
            vt = mid;
            r = mid - 1;
        }else l = mid + 1;
    }
    cout<<vt<<"\n";
    for(int v : ans) ok[v]=true;
    int m=ans.size();
    vector<int> nans;
    for(int i=1;i<=n;i++){
        if(ok[i])nans.push_back(i);
        else if(m<k){
            m++;
            nans.push_back(i);
        }
    }
    for(int j=0;j<(int)nans.size()-1;j++)cout<<nans[j]<<" ";
    cout<<nans.back();
    return 0;
}

#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…