Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
小女初来乍到,提交总是Accepted备受打击,请各位帮帮忙Source Code Problem: 1536 User: test_1536 Memory: 520K Time: 0MS Language: C++ Result: Accepted Source Code #include<iostream> #include<cstdlib> #include<cstring> #include<algorithm> #include<cmath> #include<stdio.h> using namespace std; struct tim { double t1,t2; }; tim times[60][22]; int num[60],size,nu[55][22]; double len,eps=1e-8,endx,endy,vt,ve,dp[55][22][111],T,ans; bool visit[60][22]; struct qq { double value; int id1,id2,id3; }; qq heap[1100001]; void heapify(int id) { int l=2*id+1,r=2*id+2,ii=id; if(l<size&&heap[ii].value>heap[l].value) ii=l; if(r<size&&heap[ii].value>heap[r].value) ii=r; if(ii!=id) { swap(heap[ii],heap[id]); heapify(ii); } } void min_heapify(int id) { int ii=(id-1)/2; if(id>0&&heap[ii].value>heap[id].value) { swap(heap[ii],heap[id]); min_heapify(ii); } } struct pp { double value; int id; bool operator <(const pp &temp)const { return value<temp.value; } }; pp y[100]; struct point { double x,y; }; point poly[100]; int n,m,cnt; struct train { double hx,hy,len,ru,tx,ty; int p1,p2; bool operator <(const train &temp)const { if(p1==temp.p1) return ru<temp.ru; return p1<temp.p1; } }; train trains[100]; bool inter(double x1,double y1,double x2,double y2,double x3,double y3,double x4,double y4) { double ru1,ru2; if((x2-x1)*(y4-y3)-(y2-y1)*(x4-x3)==0) return false; ru1=((x3-x1)*(y4-y3)-(y3-y1)*(x4-x3))/((x2-x1)*(y4-y3)-(y2-y1)*(x4-x3)); ru2=((x3-x1)*(y2-y1)-(y3-y1)*(x2-x1))/((x2-x1)*(y4-y3)-(y2-y1)*(x4-x3)); if(ru2>-eps&&ru2<1+eps) { while(ru1>1-eps||ru1<eps) puts("orz"); y[cnt].value=y1+ru1*(y2-y1); return true; } return false; } double dist(double x1,double y1,double x2,double y2) { return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); } double JiaJunpeng() { int i,j,s,p,q,u1,u2,u3,id1,id2,n1,n2,n3; double v,in,del,t1,t2,th1,th2,value; for(i=0;i<cnt;i++) for(j=0;j<m;j++) for(s=0;s<100;s++) dp[i][j][s]=(double)1000000000.00*(double)1000000000.000; dp[0][0][0]=0.00; heap[0].value=heap[0].id1=heap[0].id2=heap[0].id3=0; size=1; memset(nu,0,sizeof(nu)); nu[0][0]=1; while(size) { u1=heap[0].id1; u2=heap[0].id2; u3=heap[0].id3; if(u1==cnt-1) return dp[u1][u2][u3]; heap[0]=heap[size-1]; size--; heapify(0); if(u1!=0) { n1=(int)((dp[u1][u2][u3]+T-times[u1][u2].t2+eps)/T); t1=times[u1][u2].t1+T*n1; t2=times[u1][u2].t2+T*n1; } else { t1=times[u1][u2].t1; t2=times[u1][u2].t2; } for(j=0;j<2;j++) { if(j==0) id1=u1+1; else id1=u1-1; if(id1<=0) continue; del=fabs(y[u1].value-y[id1].value)/ve; if(id1==cnt-1) { if(dp[id1][0][0]>dp[u1][u2][u3]+del) { dp[id1][0][0]=dp[u1][u2][u3]+del; heap[size].id1=id1; heap[size].id2=heap[size].id3=0; heap[size++].value=dp[u1][u2][u3]+del; min_heapify(size-1); } } else { for(i=0;i<m;i++) { th1=times[id1][i].t1-del; th2=times[id1][i].t2-del; n1=(int)((dp[u1][u2][u3]+T+eps-th2)/T); th1+=n1*T; th2+=n1*T; if(th1-eps<dp[u1][u2][u3]) { value=dp[u1][u2][u3]+del; v=th2+del-value; for(s=0;s<nu[id1][i];s++) { if(dp[id1][i][s]<=value) { n2=(int)((dp[id1][i][s]+T-times[id1][i].t2+eps)/T); if(v<=times[id1][i].t2+n2*T-dp[id1][i][s]) break; } } if(s>=nu[id1][i]) { dp[id1][i][nu[id1][i]++]=value; heap[size].id1=id1; heap[size].id2=i; heap[size].id3=nu[id1][i]-1; heap[size++].value=value; min_heapify(size-1); } th1+=T; th2+=T; } if(th1<min(t2,th2)-eps) { value=th1+del; v=th2+del-value; for(s=0;s<nu[id1][i];s++) { if(dp[id1][i][s]<=value) { n2=(int)((dp[id1][i][s]+T-times[id1][i].t2+eps)/T); if(v<=times[id1][i].t2+n2*T-dp[id1][i][s]) break; } } if(s>=nu[id1][i]) { dp[id1][i][nu[id1][i]++]=value; heap[size].id1=id1; heap[size].id2=i; heap[size].id3=nu[id1][i]-1; heap[size++].value=value; min_heapify(size-1); } } } } } } return -1.000; } int main() { int i,j,s,p,q,id1,id2,ip,id; double l; while(scanf("%d%d%lf%lf%lf%lf",&n,&m,&endx,&endy,&vt,&ve)&&(n!=0||m!=0&&endx!=0&&endy!=0&&vt!=0&&ve!=0)) { for(i=0;i<n;i++) scanf("%lf%lf",&poly[i].x,&poly[i].y); for(i=0;i<m;i++) { scanf("%lf%lf%lf",&trains[i].hx,&trains[i].hy,&trains[i].len); while(trains[i].len==0.00) puts("Orz"); } len=0.00; for(i=0;i<n;i++) { id1=i; id2=(i+1)%n; len+=dist(poly[id1].x,poly[id1].y,poly[id2].x,poly[id2].y); for(j=0;j<m;j++) { if((trains[j].hy-poly[id1].y)*(poly[id2].x-poly[id1].x)==(trains[j].hx-poly[id1].x)*(poly[id2].y-poly[id1].y)) { trains[j].p1=id1; if(poly[id1].x!=poly[id2].x) trains[j].ru=(trains[j].hx-poly[id1].x)/(poly[id2].x-poly[id1].x); else trains[j].ru=(trains[j].hy-poly[id1].y)/(poly[id2].y-poly[id1].y); } } } while(vt==0.0||ve==0.0) puts("orz"); T=len/vt; sort(trains,trains+m); for(i=0;i<m;i++) { id=trains[i].p1; l=dist(trains[i].hx,trains[i].hy,poly[id].x,poly[id].y); while(l<trains[i].len) { ip=(id-1+n)%n; l+=dist(poly[id].x,poly[id].y,poly[ip].x,poly[ip].y); id=ip; } l-=trains[i].len; ip=(id+1)%n; trains[i].p2=id; trains[i].tx=poly[id].x+l*(poly[ip].x-poly[id].x)/dist(poly[ip].x,poly[ip].y,poly[id].x,poly[id].y); trains[i].ty=poly[id].y+l*(poly[ip].y-poly[id].y)/dist(poly[ip].x,poly[ip].y,poly[id].x,poly[id].y); } cnt=1; y[0].value=0.00; y[0].id=0; for(i=0;i<n;i++) { id1=i; id2=(i+1)%n; if(inter(endx,0,endx,endy,poly[id1].x,poly[id1].y,poly[id2].x,poly[id2].y)) y[cnt++].id=(i+1)%n; } sort(y+1,y+cnt); y[cnt].value=endy; y[cnt++].id=n+1; for(i=0;i<cnt-1;i++) while(y[i].value>y[i+1].value); memset(num,0,sizeof(num)); num[0]=1; times[0][0].t1=0.00; times[0][0].t2=(double)1000000000.000*(double)1000000000.000; times[cnt-1][0]=times[0][0]; num[cnt-1]=1; for(i=1;i<cnt-1;i++) { ip=(y[i].id-1+n)%n; for(j=0;j<m;j++) { id1=j; id2=(j+1)%m; id=(trains[id2].p2+1)%n; l=dist(trains[id2].tx,trains[id2].ty,poly[id].x,poly[id].y); while(id!=ip) { l+=dist(poly[id].x,poly[id].y,poly[(id+1)%n].x,poly[(id+1)%n].y); id=(id+1)%n; } l+=dist(poly[id].x,poly[id].y,endx,y[i].value); times[i][j].t1=l/vt; id=(trains[id1].p1+1)%n; l=dist(trains[id1].hx,trains[id1].hy,poly[id].x,poly[id].y); while(id!=ip) { l+=dist(poly[id].x,poly[id].y,poly[(id+1)%n].x,poly[(id+1)%n].y); id=(id+1)%n; } l+=dist(poly[id].x,poly[id].y,endx,y[i].value); times[i][j].t2=l/vt; while(times[i][j].t2<times[i][j].t1) times[i][j].t1-=T; while(times[i][j].t2>0) { times[i][j].t1-=T; times[i][j].t2-=T; } times[i][j].t1+=T; times[i][j].t2+=T; } } ans=JiaJunpeng(); if(ans>=0) printf("%.4lf\n",ans); else puts("Impossible!"); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator