poj3608 Bridge Across Islands

23333我以前一定是学了假的旋转卡壳,,,,(以前只会面积的2333)

换姿势,这个题用两条平行线搞,一共那么有一个点和一条线,两条线平行,这些个情况,那么就维护出这些东西就好了。

(说的好简单啊2333)

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <cmath>
 4 #define N 100005
 5 #define LL long long
 6 #define eps 1e-8
 7 using namespace std;
 8 inline int ra()
 9 {
10     int x=0,f=1; char ch=getchar();
11     while (ch<'0' || ch>'9') {if (ch=='-') f=-1; ch=getchar();}
12     while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();}
13     return x*f;
14 }
15 struct point
16 {
17     double x,y;
18 }A[N],B[N];
19 const double inf=1e50;
20 int n,m;
21 double cross(point c, point a, point b)
22 {
23     return (a.x-c.x)*(b.y-c.y)-(a.y-c.y)*(b.x-c.x);
24 }
25 double dot(point c, point a, point b)
26 {
27     return (a.x-c.x)*(b.x-c.x)+(a.y-c.y)*(b.y-c.y);
28 }
29 double dis(point a, point b)
30 {
31     return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
32 }
33 double point_line_dis(point a, point b, point aim)
34 {
35     if (dis(a,b)<eps) return dis(aim,a);
36     if (dot(a,aim,b)<eps) return dis(aim,a);
37     if (dot(b,aim,a)<eps) return dis(aim,b);
38     return fabs(cross(aim,a,b))/dis(a,b);
39 }
40 double line_line_dis(point a, point b, point c, point d)
41 {
42     double dis1=min(point_line_dis(a,b,c),point_line_dis(a,b,d));
43     double dis2=min(point_line_dis(c,d,a),point_line_dis(c,d,b));
44     return min(dis1,dis2);
45 }
46 double RC(point *p, point *q, int n, int m)
47 {
48     p[n]=p[0]; q[m]=q[0];
49     int down=0,up=0;
50     for (int i=0; i<n; i++) if (p[i].y<p[down].y) down=i;
51     for (int i=0; i<m; i++) if (q[i].y>q[up].y) up=i;
52     double ans=inf;
53     for (int i=0; i<n; i++)
54     {
55         double cnt;
56         while (cnt=cross(p[down+1],q[up+1],p[down])-cross(p[down+1],q[up],p[down])>eps) up=(up+1)%m;
57         if (cnt+eps<0) ans=min(ans,point_line_dis(p[down],p[down+1],q[up]));
58             else ans=min(ans,line_line_dis(p[down],p[down+1],q[up],q[up+1]));
59         down=(down+1)%n; 
60     } 
61     return ans;
62 }
63 int main(int argc, char const *argv[])
64 {
65     while (scanf("%d%d",&n,&m) && (n||m))
66     {
67         for (int i=0; i<n; i++) scanf("%lf%lf",&A[i].x,&A[i].y);
68         for (int i=0; i<m; i++) scanf("%lf%lf",&B[i].x,&B[i].y);
69         printf("%.5lf\n",min(RC(A,B,n,m),RC(B,A,m,n)));
70     }
71     return 0;
72 }

 

posted @ 2017-03-29 22:22  ws_ccd  阅读(237)  评论(0编辑  收藏  举报