CQ_Bob
2024-11-17 15:04:07
记我们选的加油站的下标序列为
注意到精度只有
il void solve(){
dfs(1),sort(v.begin(),v.end()),vis.clear();
int len=(int)(v.size());
for(re int i=0;i<len;++i) f[i]=1000000000000000.0,vis[v[i]]=i;
f[0]=0.0;
n=rd,q=rd;
for(re int i=1;i<=n;++i) cin>>p[i]>>t[i]>>x[i];
for(re int i=1;i<=q;++i) cin>>Q[i].y,Q[i].id=i;
sort(Q+1,Q+q+1),p[n+1]=1e18;
for(re int i=1,j=1;i<=n+1;++i){
while(j<=q&&Q[j].y<p[i]){
double Min=1000000000000000.0;
for(re int k=0;k<len;++k){
Min=min(Min,f[k]+(double)(Q[j].y*1.0/v[k]));
}
ans[Q[j].id]=Min;
++j;
}
if(i<=n&&x[i]>1){
for(re int k=len-1;k>=1;--k){
if((int)v[k]%(int)x[i]==0) f[k]=min(f[k],f[vis[v[k]/x[i]]]+(double)((x[i]-1)*p[i]*1.0/v[k])+t[i]);
}
}
}
for(re int i=1;i<=q;++i) printf("%.10lf\n",ans[i]);
return ;
}