提交时间:2026-04-18 14:50:14
运行 ID: 41349
#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define pi pair<int,int> #define p1 first #define p2 second #define m_p make_pair #define pb push_back #define eb emplace_back using namespace std; typedef long long ll; typedef long double db; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } const int maxn=1e6+10; const db inf=6e18,eps=1e-6; int n; ll h[maxn],u[maxn],v[maxn];db dp[maxn]; struct node{ ll k;db b; db F(ll x){return b-sqrtl(k+x);} db F2(ll x){return b+sqrtl(k-2*x);} }d[maxn],e[maxn]; int cmp(int x,int y,ll p){ if((!x)||(!y))return x|y; if(abs(d[x].F(p)-d[y].F(p))<eps)return max(x,y); return d[x].F(p)<d[y].F(p)?x:y; } int cmp2(int x,int y,ll p){ if((!x)||(!y))return x|y; if(abs(e[x].F2(p)-e[y].F2(p))<eps)return max(x,y); return e[x].F2(p)<e[y].F2(p)?x:y; } struct lct{ ll P[maxn]; int id[maxn<<2]; #define ls(p) (p<<1) #define rs(p) (p<<1|1) void upd(int s,int t,int p,int x){ if(cmp(id[p],x,P[s])==id[p]&&cmp(id[p],x,P[t])==id[p])return; if(cmp(id[p],x,P[s])==x&&cmp(id[p],x,P[t])==x)return id[p]=x,void(); int mid=s+t>>1;if(cmp(id[p],x,P[mid])==x)swap(id[p],x); if(cmp(id[p],x,P[s])==x)upd(s,mid,ls(p),x);else upd(mid+1,t,rs(p),x); } void mdf(int l,int r,int s,int t,int p,int x){ if(l<=s&&t<=r)return upd(s,t,p,x),void(); int mid=s+t>>1; if(l<=mid)mdf(l,r,s,mid,ls(p),x);if(r>mid)mdf(l,r,mid+1,t,rs(p),x); } db qu(int l,int s,int t,int p){ db w=id[p]?d[id[p]].F(P[l]):inf; if(s==t)return w; int mid=s+t>>1; if(l<=mid)return min(qu(l,s,mid,ls(p)),w); return min(qu(l,mid+1,t,rs(p)),w); } }t; struct lct2{ ll P[maxn]; int id[maxn<<2]; #define cmp cmp2 void upd(int s,int t,int p,int x){ if(cmp(id[p],x,P[s])==id[p]&&cmp(id[p],x,P[t])==id[p])return; if(cmp(id[p],x,P[s])==x&&cmp(id[p],x,P[t])==x)return id[p]=x,void(); int mid=s+t>>1;if(cmp(id[p],x,P[mid])==x)swap(id[p],x); if(cmp(id[p],x,P[s])==x)upd(s,mid,ls(p),x);else upd(mid+1,t,rs(p),x); } void clear(int s,int t,int p){ id[p]=0;if(s==t)return; int mid=s+t>>1; clear(s,mid,ls(p)),clear(mid+1,t,rs(p)); } db qu(int l,int s,int t,int p){ if(!id[p])return inf; if(s==t)return e[id[p]].F2(P[l]); int mid=s+t>>1; if(l<=mid)return min(qu(l,s,mid,ls(p)),e[id[p]].F2(P[l])); return min(qu(l,mid+1,t,rs(p)),e[id[p]].F2(P[l])); } #undef cmp }t2; int L[maxn],R[maxn],pos[maxn]; void cdq(int l,int r){ if(l==r){ int x=l; dp[x]=min(dp[x],t.qu(pos[x],1,n,1)+u[x]); d[x].k=-2*h[x],d[x].b=dp[x]; if(L[x]<=R[x])t.mdf(L[x],R[x],1,n,1,x); e[x].k=v[x]*v[x]+2*h[x],e[x].b=-v[x]+dp[x]; return; } int mid=l+r>>1;cdq(mid+1,r); vector<tuple<int,int,int> >v; up(i,l,mid)v.eb(pos[i],0,i); up(i,mid+1,r)v.eb(R[i],1,i); sort(v.begin(),v.end());t2.clear(l,mid,1); for(auto [a,b,c]:v) if(b)t2.upd(l,mid,1,c); else dp[c]=min(dp[c],t2.qu(c,l,mid,1)); cdq(l,mid); } void slv(){ n=read(); up(i,1,n)h[i]=read(),v[i]=read(),u[i]=read(); up(i,1,n)t2.P[i]=h[i]; vector<tuple<ll,int,int> >vec; up(i,1,n){ vec.eb(2*h[i],0,i); vec.eb(v[i]*v[i]+2*h[i],1,i); vec.eb(u[i]*u[i]+2*h[i],2,i); } sort(vec.begin(),vec.end()); int tot=0; for(auto [a,b,c]:vec){ if(!b)L[c]=tot+1; else if(b==1)R[c]=tot; else pos[c]=++tot,t.P[tot]=a; } up(i,1,n-1)dp[i]=inf;cdq(1,n); db res=dp[1];if(res>=4e18)res=-1;else printf("%.10Lf\n",res); } int main(){ // freopen("c.in","r",stdin),freopen("c.out","w",stdout); slv(); return 0; }