제출 #1353131

#제출 시각아이디문제언어결과실행 시간메모리
1353131huylqParkovi (COCI22_parkovi)C++20
110 / 110
531 ms33688 KiB
/*
#include <bits/stdc++.h>
#pragma GCC optimize("O3")
#define ford(a,b,c) for(int a = b; a <= c; a++)
#define fti(a,b,c) for(int a = b; a >= c; a--)
#define file(name) freopen(name ".inp", "r", stdin); freopen(name ".out", "w", stdout);
#define siz size()
#define pll pair<long long,long long>
#define pii pair<int,int>
#define ll long long
#define ms(a,b) for(int i=0;i<=a.siz;i++) a[i]=b;
#define all(a) a.begin(),a.end()
#define pb push_back
#define fi first
#define se second
using namespace std;
int n,k;
ll cur=1e18,mx,mn,ans;
vector<pii> a[200005];
vector<int> kq;
bool ispark[200005];
void dfs(int u,int p,ll sum){
    if(ispark[u]){
        mn=min(mn,sum);
        return;
    }
    for(auto [v,w]:a[u]){
        if(v==p) continue;
        dfs(v,u,sum+w);
    }
}
void sub1(){
    for(int mask=1;mask<=(1<<(n-1));mask++){
        if(__builtin_popcount(mask)!=k) continue;
        ford(i,0,n-1){
            if((mask>>i)&1) {
                ispark[i+1]=true;
            }
            else ispark[i+1]=false;
        }
        mx=0;
        mn=1e18;
        ford(i,1,n)
            if(!ispark[i]){
                mn=1e18;
                dfs(i,0,0);
                mx=max(mx,mn);
            }
        if(mx<cur){
            cur=mx;
            ans=mask;
        }
    }
    ford(i,0,n-1){
        if((ans>>i)&1) kq.pb(i+1);
    }
    cout << cur << "\n";
    for(int i:kq) cout << i << " ";
}
int st,fn;
ll d1[200005],d2[200005];
void dfsu(int u,int p,ll cnt){
    if(mx<cnt){
        mx=cnt;
        st=u;
    }
    for(auto [v,w]:a[u]){
        if(v==p) continue;
        dfsu(v,u,cnt+w);
    }
}
void dfs2(int u,int p,ll cnt){
    d1[u]=cnt;
    if(mx<cnt){
        mx=cnt;
        fn=u;
    }
    for(auto [v,w]:a[u]){
        if(v==p) continue;
        dfs2(v,u,w+cnt);
    }
}
void dfs3(int u,int p,ll cnt){
    d2[u]=cnt;
    for(auto [v,w]:a[u]){
        if(v==p) continue;
        dfs3(v,u,w+cnt);
    }
}
void sub2(){
    ans=1e18;
    cur=0;
    dfsu(1,0,0);
    mx=0;
    dfs2(st,0,0);
    dfs3(fn,0,0);
    ford(i,1,n){
        if(ans>max(d1[i],d2[i])){
            ans=max(d1[i],d2[i]);
            cur=i;
        }
    }
    cout << ans << "\n" << cur;
}
bool checksub3=true;
ll pre[200005],l=0,r;
bool check(ll mid){
    int i=1,dem=0;
    while(i<=n){
        i=upper_bound(pre+1,pre+n+1,mid-pre[i])-pre;
        if(i==n) break;
        dem++;
    }
    if(dem<=k) return 1;
    return 0;
}
void check1(ll mid){
    int i=1,dem=0;
    while(i<=n){
        i=upper_bound(pre+1,pre+n+1,mid-pre[i])-pre;
        ispark[i]=true;
        cout << i << " ";
        dem++;
    }
    ford(i,1,n){
        if(!ispark[i]){
            cout << i << " ";
            dem++;
            if(dem==k) return;
        }
    }
}
void sub3(){
    while(l<r){
        ll mid=(l+r)/2;
        if(check(mid)) l=mid;
        else r=mid-1;
    }
    cout << l << "\n";
    check1(l);
}
int main(){
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    cin >> n >> k;
    ford(i,1,n-1){
        int x,y,w;
        cin >> x >> y >> w;
        if(x!=i||y!=i+1) checksub3=false;
        pre[y]+=pre[x]+w;
        r+=w;
        a[x].pb({y,w});
        a[y].pb({x,w});
    }
    if(n<=20) sub1();
    else if(k==1) sub2();
    else if(checksub3) sub3();
    return 0;
}
*/

#include <bits/stdc++.h>
#pragma GCC optimize("O3")
#define ford(a,b,c) for(int a = b; a <= c; a++)
#define fti(a,b,c) for(int a = b; a >= c; a--)
#define file(name) freopen(name ".inp", "r", stdin); freopen(name ".out", "w", stdout);
#define siz size()
#define pll pair<long long,long long>
#define pii pair<int,int>
#define ll long long
#define ms(a,b) for(int i=0;i<=a.siz;i++) a[i]=b;
#define all(a) a.begin(),a.end()
#define pb push_back
#define fi first
#define se second
using namespace std;

const int maxn=200005;
int n,k;
vector<pii>a[maxn];
ll rem[maxn],e[maxn],cv[maxn],mid;
vector<int>res;

void dfs(int u,int p){
    rem[u]=0;
    e[u]=-1;
    for(auto x:a[u]){
        int v=x.first,w=x.second;
        if(v!=p){
            dfs(v,u);
            if(e[v]!=-1){
                if(e[v]>=w) e[u]=max(e[u],e[v]-w);
                continue;
            }
            if(rem[v]+w>mid){
                cv[v]=1;
                rem[v]=0;
                e[v]=mid;
                if(mid>=w) e[u]=max(e[u],mid-w);
            }
            else rem[u]=max(rem[u],rem[v]+w);
        }
    }
    if(e[u]>=rem[u]) rem[u]=0;
    else e[u]=-1;
    if(u==1&&e[u]==-1) cv[u]=1;
}

bool check(ll x){
    mid=x;
    memset(cv,0,sizeof(cv));
    memset(rem,0,sizeof(rem));
    ford(i,1,n) e[i]=-1;
    dfs(1,0);
    int cnt=0;
    ford(i,1,n) cnt+=cv[i];
    if(cnt<=k){
        res.clear();
        ford(i,1,n)
            if(cv[i]) res.pb(i);
        return 1;
    }
    return 0;
}

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

    cin>>n>>k;
    ll tot=0;
    ford(i,1,n-1){
        int u,v,c;
        cin>>u>>v>>c;
        a[u].pb({v,c});
        a[v].pb({u,c});
        tot+=c;
    }
    ll l=0,r=tot,ans=tot;
    while(l<=r){
        ll m=(l+r)/2;
        if(check(m)){
            ans=m;
            r=m-1;
        }
        else l=m+1;
    }
    check(ans);
    cout<<ans<<'\n';
    vector<int>mark(n+1,0);
    for(auto x:res){
        cout<<x<<" ";
        mark[x]=1;
    }
    int need=k-res.size();
    ford(i,1,n){
        if(need==0) break;
        if(!mark[i]){
            cout<<i<<" ";
            need--;
        }
    }

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