求助RE70分
查看原帖
求助RE70分
151647
sycqwq楼主2022/6/12 19:51
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=1e5+5;
int n,m,tot;
struct node
{
    int u,v,w,nxt;
}e[maxn<<1];
int head[maxn<<1];
void add(int x,int y,int w)
{
    e[++tot].u=x;
    e[tot].v=y;
    e[tot].nxt=head[x];
    head[x]=tot;
    e[tot].w=w;
}
int s=0;
multiset<int> q[maxn];
multiset<int>::iterator it;
int dfs(int x,int fa,int k)
{
    // cout<<x<<endl;
    q[x].clear();
    int ma=0;
    for(int i=head[x];i;i=e[i].nxt)
    {
        // cout<<"QWQ"<<endl;
        int v=e[i].v;
        if(v!=fa)
        {
            int tp=dfs(v,x,k)+e[i].w;
            // cout<<"###"<<x<<' '<<v<<' '<<tp<<' '<<tp-e[i].w<<endl;
            if(tp>=k)
                ++s;
            else
                q[x].insert(tp);
        }
    }
    while(!q[x].empty())
    {
        // cout<<"qwq"<<endl;
        if(q[x].size()==1)
            return max(ma,*q[x].begin());
        int xx=*q[x].begin();
        // cout<<"QAQ"<<endl;
        it=q[x].lower_bound(k-xx);
        // cout<<"QAQ"<<endl;
        if(it==q[x].begin()&&q[x].count(*it)==1)
            ++it; 
        if(it==q[x].end())
        {
            ma=max(ma,xx);
            q[x].erase(q[x].begin());
            // cout<<"QAQ"<<endl;
            continue;
        }
        // cout<<"QAQ"<<endl;
        ++s;
        q[x].erase(q[x].begin());
        q[x].erase(it);
    }
    return ma;
}
int check(int x)
{
    s=0;
    dfs(1,0,x);
    // cout<<s<<endl;
    return s>=m;
}
signed main()
{
    cin>>n>>m;
    for(int i=1;i<n;i++)
    {
        int x,y,w;
        cin>>x>>y>>w;
        add(x,y,w);
        add(y,x,w);
    }
    int l=1,ans=0,r=maxn*10000;
    while(l<=r)
    {
        int mid=l+r>>1;
        // cout<<l<<' '<<r<<endl;
        if(check(mid))
            l=mid+1,ans=mid;
        else
            r=mid-1;
    }
    cout<<ans;
    return 0;
}
2022/6/12 19:51
加载中...