提交时间:2026-04-18 16:25:47

运行 ID: 41353

#include<bits/stdc++.h> using namespace std; #define int long long #define LD long double #define pii pair<int,int> #define fr first #define sc second #define mk make_pair #define pb push_back int read(){int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f;} const int MAXN=300010,N=230; LD P=1e8,inf=4e18; int n,m,h[MAXN],u[MAXN],v[MAXN]; LD f[MAXN]; struct node{ LD A,B,C; LD qry(int x){ return C?A+C*sqrt(C*x+B):inf; } }p[MAXN<<1]; int ID[MAXN],id[MAXN],Id[MAXN],tp[MAXN],Tp[MAXN]; struct nd{ int ls,rs; }T[MAXN*N]; #define lson T[pos].ls #define rson T[pos].rs int t[MAXN*N],cnt; struct segtree{ int rt; void update(int &pos,int l,int r,int ql,int qr,int x){ if(!pos)pos=++cnt; int mid=(l+r)>>1; if(ql<=l&&qr>=r){ if(!t[pos]){t[pos]=x;return;} if(p[t[pos]].qry(tp[mid])>p[x].qry(tp[mid]))swap(x,t[pos]); if(l==r)return; if(p[t[pos]].qry(tp[l])>p[x].qry(tp[l]))update(lson,l,mid,ql,qr,x); if(p[t[pos]].qry(tp[r])>p[x].qry(tp[r]))update(rson,mid+1,r,ql,qr,x); return; } if(ql<=mid)update(lson,l,mid,ql,qr,x); if(qr>mid)update(rson,mid+1,r,ql,qr,x); } void upd(int l,int r,int x){ update(rt,1,m,l,r,x); } LD query(int pos,int l,int r,int x){ if(!pos)return inf; if(l==r)return p[t[pos]].qry(tp[x]); int mid=(l+r)>>1; if(x<=mid)return min(query(lson,l,mid,x),p[t[pos]].qry(tp[x])); if(x>mid)return min(query(rson,mid+1,r,x),p[t[pos]].qry(tp[x])); } LD qry(int x){ return query(rt,1,m,x); } }B,C[MAXN]; LD val(int x,int y){ if(u[x]*u[x]+h[x]*2<h[y]*2)return inf; if(v[y]*v[y]+2*h[y]>u[x]*u[x]+2*h[x])return u[x]-sqrt(u[x]*u[x]-2*h[y]+2*h[x]); else return sqrt(v[y]*v[y]+2*h[y]-2*h[x])-v[y]; } #define lb(x) (x&(-x)) LD qry(int x,int y){ LD res=inf; for(int i=x;i>=1;i-=lb(i))res=min(res,C[i].qry(y)); return res; } void upd(int x,int y,int l,int r){ for(int i=x;i<=m;i+=lb(i))C[i].upd(l,r,y); } bool cmp(int x,int y){return u[x]*u[x]+2*h[x]<u[y]*u[y]+2*h[y];} void slv(){ n=read(); for(int i=1;i<=n;i++)h[i]=read(),v[i]=read(),u[i]=read(),ID[i]=i,tp[i]=u[i]*u[i]+h[i]*2,tp[i+n]=v[i]*v[i]+h[i]*2,tp[i+n+n]=h[i]*2; m=3*n; sort(tp+1,tp+m+1);m=unique(tp+1,tp+m+1)-tp-1; for(int i=1;i<=n;i++)id[i]=upper_bound(tp+1,tp+m+1,u[i]*u[i]+h[i]*2)-tp-1; for(int i=1;i<=n;i++)ID[i]=upper_bound(tp+1,tp+m+1,v[i]*v[i]+h[i]*2)-tp-1; for(int i=1;i<=n;i++)Id[i]=upper_bound(tp+1,tp+m+1,h[i]*2)-tp-1; for(int i=1;i<=n;i++){ if(i!=1)f[i]=min(qry(ID[i],Id[i]),B.qry(ID[i])-v[i]); p[i]={f[i]+u[i],(LD)u[i]*u[i]+2*h[i],-1}; p[i+n]={f[i],(LD)-2*h[i],1}; B.upd( Id[i] , id[i] ,i+n); upd(id[i],i,1, id[i] ); } if(f[n]>=1e18)puts("-1"); else printf("%.10Lf\n",f[n]); } signed main(){ // freopen("1.in","r",stdin);freopen("1.out","w",stdout); slv(); //cerr<<clock()*1.0/CLOCKS_PER_SEC<<"s\n"; return 0; }