用的二分全是mle,样例也过不了
#include<bits/stdc++.h>
using namespace std;
const int inf=50010;
int fa[inf],lef[inf],a,m,n,checkm;
struct node{
int to;
int data;
};
vector<node> v[inf];
void dfs(int x){
for(int i=0;i<v[x].size();i++){
if(v[x][i].to==fa[x]) continue;
fa[v[x][i].to]=x;
dfs(v[x][i].to);
}
}
bool cmp(node n1,node n2){
return lef[n1.to]>lef[n2.to];
}
void check(int x,int len){
for(int i=0;i<v[x].size();i++){
if(v[x][i].to==fa[x]) continue;
check(v[x][i].to,len);
lef[v[x][i].to]+=v[x][i].data;
}
sort(v[x].begin(),v[x].end(),cmp);
int i=0,j=v[x].size()-1;
while(lef[v[x][i].to]>=len){
i++;
checkm++;
}
while(lef[v[x][i].to]+lef[v[x][j].to]>=len && i<j){
i++;
j--;
checkm++;
}
if(i<=j) lef[x]=lef[v[x][i].to];
}
int main(){
cin>>n>>m;
int l=1,r;
for(int i=1;i<n;i++){
int x,y,w;
cin>>x>>y>>w;
r+=w;
v[x].push_back(node{y,w});
v[y].push_back(node{x,w});
}
while(l<=r){
int mid=(l+r)/2;
memset(lef,0,sizeof(lef));
checkm=0;
check(1,mid);
if(checkm>=m){
a=mid;
l=mid+1;
}
else r=mid-1;
}
cout<<a;
return 0;
}