제출 #1353124

#제출 시각아이디문제언어결과실행 시간메모리
1353124huylqParkovi (COCI22_parkovi)C++20
10 / 110
505 ms31380 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=200009;
int n,k;
vector<pii>a[maxn];
ll need[maxn],cover[maxn];
ll inf=1e18;
int cnt;
bool park[maxn];
ll R;

void dfs(int u,int par){
    need[u]=0;
    cover[u]=inf;
    for(auto x:a[u]){
        int v=x.first,w=x.second;
        if(v==par) continue;
        dfs(v,u);
        if(need[v]!=-1){
            if(need[v]+w>R){
                cnt++;
                park[v]=1;
                cover[u]=min(cover[u],0LL+w);
            }
            else need[u]=max(need[u],need[v]+w);
        }
        if(cover[v]!=inf) cover[u]=min(cover[u],cover[v]+w);
    }
    if(need[u]!=-1&&cover[u]!=inf&&(need[u]+cover[u])<=R) need[u]=-1;
}

bool chec(ll mid){
    R=mid;
    cnt=0;
    fill(park+1,park+1+n,0);
    dfs(1,0);
    if(need[1]!=-1){
        cnt++;
        park[1]=1;
    }
    return cnt<=k;
}

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

    ll l=0,r=0;
    cin>>n>>k;
    ford(i,1,n-1){
        int u,v,w;
        cin>>u>>v>>w;
        a[u].pb({v,w});
        a[v].pb({u,w});
        r+=w;
    }
    while(l<r){
        ll mid=(l+r)/2;
        if(chec(mid)) r=mid;
        else l=mid+1;
    }
    chec(r);
    vector<int>ans;
    ford(i,1,n)
        if(park[i]) ans.pb(i);
    cout<<r<<'\n';
    ford(i,0,(int)ans.size()-2)
        cout<<ans[i]<<" ";
    cout<<ans.back();

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