又T又WA
#include<bits/stdc++.h>
using namespace std;
#define re register
const int N=5e5+100;
const double eps=0.00001,inf=-10000000;
int n,L,R,sum; bool vis[N]; vector<int>g[N];
int rt,mx[N],si[N],mxde,nwde; double dis[N],line[N];
int ne[N],to[N],head[N],tot; double w[N];
void add(int x,int y,double z){
ne[++tot]=head[x];
to[tot]=y,w[tot]=z;
head[x]=tot;
return;
}
void get_dis(int u,double d,int de,int fa){
nwde=max(nwde,de);
dis[de]=max(dis[de],d);
for(int i=head[u];i;i=ne[i]){
int v=to[i];
if(v==fa or vis[v]) continue;
get_dis(v,d+w[i],de+1,u);
}
return;
}
int q[N],h,tail; bool flag;
void cacal(int u){
mxde=0,h=1,tail=0;//double all=inf;
for(re int k=head[u];k;k=ne[k]){
if(flag) return;
int v=to[k];
if(vis[v]) continue;
nwde=0,get_dis(v,w[k],1,u);
int i=nwde,j=-1;
while(i+1>R) i--;
for(;i>=1;i--){
while(j+1<=mxde and (j+1)+i+1<=R){
j++;
while(h<=tail and line[q[tail]]<=line[j]) tail--;
q[++tail]=j;
}
while(h<=tail and q[h]+1+i<L) h++;
if(dis[i]+line[q[h]]>0) flag=1;
if(flag) return;
// all=max(all,dis[i]+line[q[h]]);
}
for(re int o=0;o<=nwde;o++) line[o]=max(line[o],dis[o]),dis[o]=inf;
mxde=max(mxde,nwde);
}
for(re int i=0;i<=mxde;i++) line[i]=inf;
return;
}
void solve(int u){
vis[u]=1;
cacal(u);
if(flag) return;
for(re int i=0;i<g[u].size();i++){
solve(g[u][i]);
if(flag) return;
}
return;
}
void get_rt(int u,int fa){
mx[u]=0,si[u]=1;
for(re int i=head[u];i;i=ne[i]){
int v=to[i];
if(v==fa or vis[v]) continue;
get_rt(v,u);
si[u]+=si[v];
mx[u]=max(mx[u],si[v]);
}
mx[u]=max(mx[u],sum-si[u]);
if(mx[u]<=mx[rt]) rt=u;
return;
}
void build(int u,int fa){
vis[u]=1;
for(re int i=head[u];i;i=ne[i]){
int v=to[i];
if(v==fa or vis[v]) continue;
sum=si[v],rt=0,mx[rt]=n+1;
get_rt(v,u);
g[u].push_back(v);
}
for(re int i=0;i<g[u].size();i++) build(g[u][i],0);
return;
}
int main(){
double l=-inf,r=0,ans=0;
cin>>n>>L>>R; L++,R++;
for(re int i=1;i<n;i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z*1.0),add(y,x,z*1.0);
l=min(l,z*1.0),r=max(r,z*1.0);
}
int RT;
sum=n,rt=0,mx[rt]=n+1;
get_rt(1,0),RT=rt,build(rt,0);
while(r-l>=eps){
for(re int i=0;i<=n;i++) dis[i]=line[i]=inf,vis[i]=0;
double mid=(l+r)/2;
for(re int i=1;i<=tot;i++) w[i]-=mid;
flag=0,solve(RT);
if(flag) l=mid+eps,ans=mid;
else r=mid-eps;
for(re int i=1;i<=tot;i++) w[i]+=mid;
}
printf("%.3lf",ans);
return 0;
}
/*
5
3 3
1 2 3
2 3 5
2 4 2
4 5 1
*/