假設s在t左邊,那麼只能往右或者上下走
f[i]表示s到i點的最短路
f[i]=min(f[j]+dis(i,j)(i能看到j))
判斷i能看到j就維護乙個上凸殼和乙個下凸殼
時間複雜度$o(n^2)$
**寫的有點長…
#include#include#include#define n 2010
using namespace std;
struct pp(int _x,int _y)p operator-(const p&a)};
inline int cross(p a,p b)
inline double dis(p a,p b)
int n,i,x1[n],y1[n],x2[n],y2[n],xs,ys,xt,yt,st,en;
double v,f[n][4],ans,inf=1e9;
inline void call(int x,int y,int p,double&t)
tmp=p(x2[i],y1[i]);
if(cross(down-o,tmp-o)<=0)
tmp=p(x1[i],y2[i]);
if(cross(up-o,tmp-o)>=0)
tmp=p(x1[i],y1[i]);
if(cross(down-o,tmp-o)<=0)
} tmp=p(x2[st],y2[st]);
if(cross(up-o,tmp-o)>=0)
tmp=p(x2[st],y1[st]);
if(cross(down-o,tmp-o)<=0)
tmp=p(xs,ys);
if(cross(up-o,tmp-o)>=0&&cross(down-o,tmp-o)<=0)t=dis(o,tmp);//在up下邊或者重合 在down上邊或者重合
}inline void calr(int x,int y,int p,double&t)
tmp=p(x1[p],y1[p]);
if(cross(down-o,tmp-o)<=0)
for(int i=p-1;i>st;i--)
tmp=p(x2[i],y1[i]);
if(cross(down-o,tmp-o)<=0)
tmp=p(x1[i],y2[i]);
if(cross(up-o,tmp-o)>=0)
tmp=p(x1[i],y1[i]);
if(cross(down-o,tmp-o)<=0)
} tmp=p(x2[st],y2[st]);
if(cross(up-o,tmp-o)>=0)
tmp=p(x2[st],y1[st]);
if(cross(down-o,tmp-o)<=0)
tmp=p(xs,ys);
if(cross(up-o,tmp-o)>=0&&cross(down-o,tmp-o)<=0)t=dis(o,tmp);//在up下邊或者重合 在down上邊或者重合
}int main()
for(i=n;i;i--)if(x1[i]<=xt&&xt<=x2[i]&&y1[i]<=yt&&yt<=y2[i])
f[st][2]=dis(p(xs,ys),p(x2[st],y1[st]));
f[st][3]=dis(p(xs,ys),p(x2[st],y2[st]));
for(i=st+1;icall(x1[en],y1[en],en,f[en][0]);
call(x1[en],y2[en],en,f[en][1]);
calr(xt,yt,en,ans);
printf("%.10f",ans/v);
return 0;
}
NOI 2011 道路修建
在 w 星球上有 n 個國家。為了各自國家的經濟發展,他們決定在各個國家 之間建設雙向道路使得國家之間連通。但是每個國家的國王都很吝嗇,他們只願 意修建恰好 n 1 條雙向道路。每條道路的修建都要付出一定的費用,這個費用等於道路長度乘以道路兩端 的國家個數之差的絕對值。例如,在下圖中,虛線所示道路兩...
NOI2011 道路修建
time limit 10 sec memory limit 128 mb submit 3967 solved 1367 submit status discuss 在 w 星球上有 n 個國家。為了各自國家的經濟發展,他們決定在各個國家 之間建設雙向道路使得國家之間連通。但是每個國家的國王都很吝...
NOI2011 道路修建
在 w 星球上有 n 個國家。為了各自國家的經濟發展,他們決定在各個國家 之間建設雙向道路使得國家之間連通。但是每個國家的國王都很吝嗇,他們只願 意修建恰好 n 1 條雙向道路。每條道路的修建都要付出一定的費用,這個費用等於道路長度乘以道路兩端 的國家 個數之差的絕對值。例如,在下圖中,虛線所示道路...