RT,开成全局数组都是R
在dfs函数里开就是AC+TLE
分别是f[],g[]
#include <bits/stdc++.h>
using namespace std;
const int maxn = 5e+4+100;
struct Edge{
int u,v,w;
};
int n,m;
int l,r,cnt;
int he[maxn],ne[maxn<<1],_cnt=1;
Edge G[maxn<<1];
int g[maxn];
int V[maxn],f[maxn];
void add_Edge(int u,int v,int w){
G[_cnt].v = v;
G[_cnt].w = w;
ne[_cnt] = he[u];
he[u] = _cnt++;
}
inline void dfs(int u,int fa,int k){
//vector <int> V,f;
for(int i=he[u];i;i=ne[i]){
int v=G[i].v;
int w=G[i].w;
if(v==fa) continue;
dfs(v,u,k);
//V.push_back(w+g[v]);
//f.push_back(0);
}
int ccnt=0,i;
for(int i=he[u];i;i=ne[i]){
int v=G[i].v;
int w=G[i].w;
if(v==fa) continue;
V[++ccnt] = g[v]+w;
f[ccnt] = 1;
}
sort(V+1,V+ccnt+1);
for(i=ccnt;i>=1;--i){
if(V[i]>=k){
//printf("bug\n");
f[i]=0;
++cnt;
}else break;
}
for(register int j=1;j<=ccnt;++j){
if(f[j]){
int t=lower_bound(V+1,V+ccnt+1,k-V[j])-V;
while(j==t||!f[t])++t;
if(t<=ccnt){
//printf("bug %d %d\n",V[i],V[t]);
f[t]=f[j]=0;
++cnt;
}
}
}
g[u]=0;
for(int j=ccnt;j>=1;--j){
if(f[j]){
g[u] = V[j];
break;
}
}
//printf("dfs %d %d %d g[%d] = %d %d\n",l,r,k,u,g[u],cnt);
return ;
}
inline bool check(int k){
cnt=0;
dfs(1,0,k);
//printf("check %d\n",cnt);
return cnt>=m;
}
int binary_search(){
int res,mid;
while(l<=r){
mid = l+r>>1;
if(check(mid)){
res = mid;
l=mid+1;
}else{
r=mid-1;
}
}
return res;
}
int main(){
cin>>n>>m;
for(register int i=1;i<n;++i){
int u,v,w;cin>>u>>v>>w;
add_Edge(u,v,w);
add_Edge(v,u,w);
r+=w;
}
printf("%d",binary_search());
return 0;
}