调一辈子没调出来。
#include<bits/stdc++.h>
#define int long long
#define double long double
#define N 1000005
#define INF 1e18
using namespace std;
int n,m,t[N<<2],d[N],R[N],v[N],tot;
double k[N],b[N],dp[N],ans=INF;
double y(int x,int z){
return (double)x*k[z]+b[z];
}
void add(int p,int l,int r,int x){
if(l==r){
if(y(l,x)<y(l,t[p])) t[p]=x;
return;
}
int mid=l+r>>1;
if(y(mid,x)<y(mid,t[p])) swap(x,t[p]);
if(y(l,x)<y(l,t[p])) add(p<<1,l,mid,x);
if(y(r,x)<y(r,t[p])) add(p<<1|1,mid+1,r,x);
}
double query(int p,int l,int r,int x){
if(l==r) return y(x,t[p]);
int mid=l+r>>1;
if(x<=mid) return min(y(x,t[p]),query(p<<1,l,mid,x));
else return min(y(x,t[p]),query(p<<1|1,mid+1,r,x));
}
signed main(){
ios::sync_with_stdio(false);
cin>>n>>m,b[0]=INF;
for(int i=1;i<=n;i++) cin>>d[i]>>R[i]>>v[i];
dp[1]=v[1],k[1]=1.0/(2*sqrt(R[1])),b[1]=dp[1]-d[1]/(2.0*sqrt(R[1])),add(1,1,n,1);
for(int i=2;i<=n;i++){
dp[i]=query(1,1,n,i)+v[i];
k[i]=1.0/(2*sqrt(R[i])),b[i]=dp[i]-d[i]/(2.0*sqrt(R[i])),add(1,1,n,i);
}
for(int i=1;i<=n;i++){
if(d[i]+R[i]>=m) ans=min(ans,dp[i]);
}
cout<<fixed<<setprecision(3)<<ans;
return 0;
}