Submission #1161202

#TimeUsernameProblemLanguageResultExecution timeMemory
116120212345678Parkovi (COCI22_parkovi)C++17
10 / 110
572 ms39744 KiB
#include <bits/stdc++.h>

using namespace std;

#define ll long long

const int nx=2e5+5;

ll n, k, lst[nx], far[nx], u, v, w, dist[nx], l=0, r=1e18, md, cnt;
vector<pair<ll, ll>> d[nx];
vector<ll> res;

void dfs(ll u, ll p, ll lstw)
{
    int c=0;
    lst[u]=far[u]=-1;
    for (auto [v, w]:d[u])
    {
        if (v==p) continue;
        dist[v]=dist[u]+w;
        dfs(v, u, w);
        c++;
        if (far[v]!=-1&&(far[u]==-1||dist[far[v]]>dist[far[u]])) far[u]=far[v];
        if (lst[v]!=-1&&(lst[u]==-1||dist[lst[v]]<dist[lst[u]])) lst[u]=lst[v];
    }
    if (c==0) far[u]=u;
    if (lst[u]!=-1&&far[u]!=-1&&dist[lst[u]]+dist[far[u]]-2*dist[u]<=md) far[u]=-1;
    if (far[u]==-1&&lst[u]!=-1&&dist[lst[u]]-dist[u]>md) far[u]=u;
    if (far[u]!=-1&&dist[far[u]]-dist[u]+lstw>md) cnt++, res.push_back(u), far[u]=-1, lst[u]=u;
    if (u==p&&far[u]!=-1) cnt++, res.push_back(u);

}

int main()
{
    cin.tie(NULL)->sync_with_stdio(false);
    cin>>n>>k;
    for (int i=1; i<n; i++) cin>>u>>v>>w, d[u].push_back({v, w}), d[v].push_back({u, w});
    while (l<r)
    {
        md=(l+r)/2;
        res.clear();
        cnt=0;
        dfs(1, 1, 0);
        //cout<<"debug "<<md<<' '<<cnt<<'\n';
        if (cnt<=k) r=md;
        else l=md+1;
    }
    res.clear();
    md=l;
    dfs(1, 1 ,0);
    cout<<md<<'\n';
    for (auto x:res) cout<<x<<' ';

}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...