| Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
|---|---|---|---|---|---|---|---|---|---|
| 41361 | baka24 | 【BJ】T3 | C++ | 运行超时 | 50 | 3000 MS | 427360 KB | 3359 | 2026-04-18 17:15:31 |
#include<bits/stdc++.h> using namespace std; #define ll 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 bool AAA; ll read(){ll 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=150; LD P=1e8,inf=4e18; int n,m; ll h[MAXN],u[MAXN],v[MAXN]; LD f[MAXN]; struct node{ LD A,B; short C; LD qry(ll x){ return C?C==1?A+sqrt(x+B):A-sqrt(B-x):inf; } }p[MAXN<<1]; int ID[MAXN],id[MAXN],Id[MAXN],_id[MAXN],_ID[MAXN]; ll tp[3*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){ LD res=inf; while(pos){ if(l==r)return min(res,p[t[pos]].qry(tp[x])); int mid=(l+r)>>1; if(x<=mid)res=min(res,p[t[pos]].qry(tp[x])),pos=lson,r=mid; if(x>mid)res=min(res,p[t[pos]].qry(tp[x])),pos=rson,l=mid+1; } return res; } LD qry(int x){ return query(rt,1,m,x); } }B,C[MAXN]; #define lb(x) (x&(-x)) int ts; 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<=ts;i+=lb(i))C[i].upd(l,r,y); } ll t1[MAXN],t2[MAXN],t3[MAXN]; 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]=tp[i]=t1[i]=u[i]*u[i]+h[i]*2,tp[i+n]=t2[i]=v[i]*v[i]+h[i]*2,tp[i+n+n]=t3[i]=h[i]*2; m=3*n; sort(tp+1,tp+m+1);m=unique(tp+1,tp+m+1)-tp-1; sort(Tp+1,Tp+n+1);ts=unique(Tp+1,Tp+n+1)-Tp-1; for(int i=1;i<=n;i++)_id[i]=upper_bound(Tp+1,Tp+ts+1,t1[i])-Tp-1; for(int i=1;i<=n;i++)_ID[i]=upper_bound(Tp+1,Tp+ts+1,t2[i])-Tp-1; for(int i=1;i<=n;i++)id[i]=upper_bound(tp+1,tp+m+1,t1[i])-tp-1; for(int i=1;i<=n;i++)ID[i]=upper_bound(tp+1,tp+m+1,t2[i])-tp-1; for(int i=1;i<=n;i++)Id[i]=upper_bound(tp+1,tp+m+1,t3[i])-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)t1[i],-1}; p[i+n]={f[i],(LD)-t3[i],1}; B.upd( Id[i] , id[i] ,i+n); upd(_id[i],i,1, id[i] ); } if(f[n]>=3e18)puts("-1"); else printf("%.10Lf\n",f[n]); } bool BBB; signed main(){ // freopen("1.in","r",stdin);freopen("1.out","w",stdout); slv(); // cerr<<clock()*1.0/CLOCKS_PER_SEC<<"s\n"<<((&AAA)-(&BBB))/1024.0/1024<<"MB\n"; return 0; }