Submission #1185617

#TimeUsernameProblemLanguageResultExecution timeMemory
1185617asli_bgParkovi (COCI22_parkovi)C++20
30 / 110
1233 ms66572 KiB
#include <bits/stdc++.h>
using namespace std;

#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;

#define int long long

typedef pair<int,int> pii;
typedef vector<int> vi;
typedef vector<pii> vii;
typedef vector<bool> vb;

typedef tree<pii,null_type,less<pii>,rb_tree_tag,
tree_order_statistics_node_update> oset;

#define fi first
#define se second
#define pb push_back

#define mid (l+r)/2
#define all(x) x.begin(),x.end()
#define FOR(i,a) for(int i=0;i<(a);i++)
#define FORE(i,a,b) for(int i=(a);i<(b);i++)

#define cont(x) for(auto el:x) cout<<el<<' ';cout<<endl;
#define contp(x) for(auto el:x) cout<<el.fi<<'-'<<el.se<<' ';cout<<endl;
#define sp <<" "<<

#define DEBUG(x) cout<<(#x) sp x<<endl

const int INF=1e18;
const int MAXN=2e5+5;

int n,k;
vii adj[MAXN];

int cur;

int tut[MAXN]; //eşleşmemiş max uzaktakini tutacak
int park[MAXN]; //closest parkı tutacak

bool mark[MAXN], used[MAXN];

set<int> res;

void dfs(int nd,int ata){
    park[nd]=INF;
    tut[nd]=0;
    
    set<pii> s;

    int c=0;

    for(auto [kom,cost]:adj[nd]){
        if(kom==ata) continue;
        dfs(kom,nd);

        if(!(tut[kom]==0 and used[kom])){
            if(tut[kom]+cost>cur){
                //park yap
                mark[kom]=true;
                park[kom]=0;
                tut[kom]=0;
                used[kom]=true;
            }
        }

        if(park[kom]!=INF){
            park[nd]=min(park[nd],park[kom]+cost);
            s.insert({park[kom]+cost,kom});
        }
    }

    for(auto [kom,cost]:adj[nd]){
        if(kom==ata) continue;
        if(tut[kom]==0 and used[kom]) continue; //taşınacak yok
        
        if(tut[kom]+cost<=cur){ //ataya çıkabilen komşu
            
            /*cout<<"here" sp nd sp kom<<endl;
            cout<<"cost" sp tut[kom] sp cost<<endl;
            contp(s);*/

            if(s.size()<=1){
                //sibling yok
                tut[nd]=max(tut[nd],tut[kom]+cost);
            }
            else{
                //siblinglerdeki herhangi bir parka gidebiliyor mu
                auto it=s.begin();
                auto deg=*it;
                if(deg.se==kom){
                    it++;
                    deg=*it;
                }

                if(deg.fi+tut[kom]+cost>cur){
                    //eşleşemedi
                    tut[nd]=max(tut[nd],tut[kom]+cost);
                }
            }
        }
    }

    //ben eşleşiyor muyum bak
    if(park[nd]<=cur){
        used[nd]=true;
    }
}

bool check(int x){
    vi ans;
    cur=x;
    FORE(i,1,n+1){
        mark[i]=used[i]=false;
    }

    dfs(1,-1);

    if(!used[1]) mark[1]=true;

    FORE(i,1,n+1){
        if(mark[i]) ans.pb(i);
    }

    if(ans.size()<=k){
        res.clear();
        for(auto el:ans) res.insert(el);
        return true;
    }

    return false;
}

signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    cin>>n>>k;
    FOR(i,n-1){
        int a,b,c;
        cin>>a>>b>>c;
        adj[a].pb({b,c});
        adj[b].pb({a,c});
    }

    int l=-1;
    int r=INF;
    while(l+1<r){
        if(check(mid)) r=mid;
        else l=mid;
    }

    int i=1;
    while(res.size()<k) res.insert(i++);

    cout<<r<<endl;
    cont(res);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...