제출 #1357706

#제출 시각아이디문제언어결과실행 시간메모리
1357706warrennPaths (RMI21_paths)C++20
100 / 100
218 ms25752 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long 
#define ii pair<int,int>
#define fir first
#define sec second
#define pb push_back

const int maxn=1e5;

vector<ii>adj[maxn+2];
int n,k;
ii dp[maxn+2];
int val[maxn+2];

void dfs(int cur,int par){
    dp[cur]={0,cur};
    for(auto [v,w] : adj[cur]){
        if(v==par)continue;
        dfs(v,cur);
        dp[v].fir+=w;
        dp[cur]=max(dp[cur],dp[v]);
    }
}

set<ii>lbh,krg;
int tot=0,ans[maxn+2];

void add(ii cur){
    if(lbh.size()<k){
        lbh.insert(cur);
        tot+=cur.fir; return;
    }
    ii cek=*lbh.begin();
    if(cek.fir<cur.fir){
        lbh.erase(cek); krg.insert(cek);
        lbh.insert(cur);
        tot+=(cur.fir-cek.fir);
    }
    else{
        krg.insert(cur);
    }
}

void del(ii cur){
    if(!krg.count(cur) && !lbh.count(cur))return;
    if(krg.count(cur)){
        krg.erase(cur); return;
    }

    tot-=cur.first; lbh.erase(cur);
    if(krg.size()){
        ii cek=*krg.rbegin();
        krg.erase(cek); lbh.insert(cek);
        tot+=cek.first;
    }
}

void reroot(int cur,int par,ii anc){
    ans[cur]=tot;
    vector<ii>elem,pref,suf;

    for(auto [v,w] : adj[cur]){
        if(v==par){
            elem.pb(anc); continue;
        }
        elem.pb(dp[v]);
    }

    pref.resize(elem.size()),suf.resize(elem.size());
    pref[0]=elem[0];
    for(int q=1;q<pref.size();q++){
        pref[q]=max(pref[q-1],elem[q]);
    }
    suf[suf.size()-1]=elem.back();
    for(int q=suf.size()-2;q>=0;q--){
        suf[q]=max(suf[q+1],elem[q]);
    }

    for(int q=0;q<adj[cur].size();q++){
        auto [v,w]=adj[cur][q];
        if(v==par)continue;
        ii best={-1,-1};
        if(adj[cur].size()==1)best={0,cur};
        
        if(q)best=max(best,pref[q-1]);
        if(q<adj[cur].size()-1)best=max(best,suf[q+1]);

        del(best); add({best.fir+w,best.sec});
        del(dp[v]); add({dp[v].fir-w,dp[v].sec});

        reroot(v,cur,{best.fir+w,best.sec});

        del({best.fir+w,best.sec}); add(best);
        del({dp[v].fir-w,dp[v].sec}); add(dp[v]);
    }
}

signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    cin>>n>>k;
    for(int q=1;q<n;q++){
        int u,v,w;
        cin>>u>>v>>w;
        adj[u].pb({v,w}); adj[v].pb({u,w});
    }
    dfs(1,0);
    for(int q=1;q<=n;q++){
        val[dp[q].second]=max(val[dp[q].second],dp[q].first);
    }

    for(int q=1;q<=n;q++){
        if(adj[q].size()==1){
            //cout<<val[q]<<' '<<q<<endl;
            add({val[q],q});
        }
    }
    reroot(1,0,{-1,-1});

    for(int q=1;q<=n;q++){
        cout<<ans[q]<<endl;
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...