#include #include #include using namespace std; int xx[512],yy[512]; int x1[256],x2[256],y1[256],y2[256]; int numx,numy; int bsx(int x) { int l=0,r=numx-1; while(l<=r) { int mid=(l+r)>>1; if(xx[mid]==x) { return mid; } if(x>1; if(yy[mid]==y) { return mid; } if(yb.d; } }; priority_queue q; void dijkstra(int s) { d[s]=0; node ss; ss.u=s; ss.d=0; q.push(ss); while(!q.empty()) { node u=q.top(); q.pop(); if(u.d>d[u.u]) { continue; } for(int i=head[u.u];i;i=last[i]) { int v=to[i]; if(u.d+w[i]xx[numx]) { numx++; xx[numx]=xx[i]; } if(yy[i]>yy[numy]) { numy++; yy[numy]=yy[i]; } } numx++; numy++; for(int i=0;i<=n;i++) { x1[i]=bsx(x1[i])+1; x2[i]=bsx(x2[i])+1; y1[i]=bsy(y1[i])+1; y2[i]=bsy(y2[i])+1; } for(int i=1;i<=numx*numy;i++) { head[i]=0; } cnt=0; for(int i=0;i<=numx+1;i++) { for(int j=0;j<=numy+1;j++) { a[i][j]=0; } } for(int i=0;i1) { add((i-2)*numy+j,(i-1)*numy+j,(double)(xx[i-1]-xx[i-2])/(a[i][j]+1)); add((i-1)*numy+j,(i-2)*numy+j,(double)(xx[i-1]-xx[i-2])/(a[i][j]+1)); } } } for(int i=0;i<=numx+1;i++) { for(int j=0;j<=numy+1;j++) { a[i][j]=0; } } for(int i=0;i1) { add((i-1)*numy+j-1,(i-1)*numy+j,(double)(yy[j-1]-yy[j-2])/(a[i][j]+1)); add((i-1)*numy+j,(i-1)*numy+j-1,(double)(yy[j-1]-yy[j-2])/(a[i][j]+1)); } } } for(int i=1;i<=numx*numy;i++) { d[i]=2000000005; } dijkstra((x1[n]-1)*numy+y1[n]); printf("%.5f\n",d[(x2[n]-1)*numy+y2[n]]); } return 0; }