Submission #1167556

#TimeUsernameProblemLanguageResultExecution timeMemory
1167556WarinchaiParkovi (COCI22_parkovi)C++20
0 / 110
592 ms23060 KiB
#include<bits/stdc++.h>
#define int long long
using namespace std;
vector<pair<int,int>>adj[200006];
int w[200006];
int vis[200005];
int sum[200005];
int dp[200005];
int back[200005];
int place[200005];
int n,k;
vector<int>ans;
int check(int m){
    for(int i=1;i<=n;i++)dp[i]=0;
    for(int i=2;i<=n;i++){
        int st=1,en=i,ans=0;
        while(st<=en){
            int md=(st+en)/2;
            //cerr<<st<<" "<<en<<" "<<md<<"\n";
            if(sum[i-1]-sum[md-1]<=m){
                ans=md;
                en=md-1;
            }else{
                st=md+1;
            }
        }
        //cerr<<"ans1:"<<ans<<"\n";
        int ans2=0;
        st=1,en=ans;
        while(st<=en){
            int md=(st+en)/2;
            if(sum[ans-1]-sum[md-1]<=m){
                ans2=md;
                en=md-1;
            }else{
                st=md+1;
            }
        }
        back[i]=ans2-1;
        place[i]=ans;
        if(ans2==1)dp[i]=0;
        else dp[i]=dp[ans2-1]+1;
        //cerr<<"i:"<<i<<" "<<ans2<<"\n";
    }
    //cerr<<m<<" "<<dp[n]<<"\n";
    if(dp[n]>k){
        return false;
    }else{
        return true;
    }
}
int32_t main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cin>>n>>k;
    for(int i=1;i<n;i++){
        int a,b,c;cin>>a>>b>>c;
        adj[a].push_back({b,c});
        adj[b].push_back({a,c});
        w[a]=c;
        sum[i]=sum[i-1]+w[i];
    }
    int st=0,en=2e15;
    int opt=0;
    //cerr<<"work\n";
    while(st<=en){
        int m=(st+en)/2;
        if(check(m)){
            en=m-1;
            opt=m;
        }else{
            st=m+1;
        }
    }
    cout<<opt<<"\n";
    check(opt);
    int cur=n;
    vector<int>v;
    while(cur!=0){
        //cerr<<cur<<"\n";
        v.push_back(place[cur]);
        cur=back[cur];
    }
    for(auto x:v)cout<<x<<" ";
    int left=k-v.size();
    int cnt=v.size();
    if(cnt==k)return 0;
    for(int i=1;i<=n;i++){
        if(!vis[i])cout<<i<<" ",cnt++;
        if(cnt==k)return 0;
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...