noip 2018 day1 T3 赛道修建 贪心_树上问题_multiset

Code:

// luogu-judger-enable-o2
#include<bits/stdc++.h>
using namespace std;

#define maxn 50008
#define MAXR 500000001
#define ll int 

multiset <ll> S[maxn];
multiset <ll> :: iterator it;
int head[maxn], to[maxn << 1], nex[maxn << 1], val[maxn << 1];
int cnt,n, m, edges;
ll mid; 

void setIO(string a){
    freopen((a+".in").c_str(),"r",stdin); 
}

void addedge(int u,int v,int c){
    nex[++edges] = head[u], head[u] = edges, to[edges] = v, val[edges] = c;
}

void read(){
    scanf("%d%d",&n,&m);
    for(int i = 1;i < n;++i){
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        addedge(a,b,c);
        addedge(b,a,c);
    }
}

ll dfs(int u,int fa){
    S[u].clear();
    for(int v = head[u]; v ; v = nex[v]){
        if(to[v] == fa) continue;
        ll t = dfs(to[v], u) + val[v];
        if(t >= mid)  ++cnt;
        else S[u].insert(t); 
    }

    ll MAX = 0;

    while(!S[u].empty()){
        if(S[u].size() == 1)  return max(MAX, *S[u].begin());
        it = S[u].lower_bound(mid - *S[u].begin());
        if(it == S[u].begin() && S[u].count(*it) == 1) it++;
        if(it == S[u].end()){
            MAX = max(MAX, *S[u].begin()); 
            S[u].erase(S[u].find(*S[u].begin()));
        } else {
            ++cnt ;
            S[u].erase(S[u].find(*it));
            S[u].erase(S[u].find(*S[u].begin()));
        } 
    }

    return MAX;
}

bool check(){
    cnt = 0;
    dfs(1, 0);
    if(cnt >= m) return true;
    return false;
}

void solve(){
    ll l = 0, r = MAXR, ans = 0;
    while(l <= r){
        mid = (l + r) >> 1;
        if(check()) ans = mid, l = mid + 1;
        else r = mid - 1;
    }
    printf("%lld", ans);
}

void shut(){
    fclose(stdin);
}

int main(){
    //setIO("input");
    read();
    solve();
    shut();
    return 0;
}

  

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值