# BZOJ 1038 半平面交

View Code
  1 #include <iostream>
2 #include <cstring>
3 #include <cstdlib>
4 #include <cstdio>
5 #include <algorithm>
6
7 #define N 555
8 #define EPS 1e-7
9 #define INF 1e12
10
11 using namespace std;
12
13 struct PO
14 {
15     double x,y;
16     void prt() {printf("%lf     %lf\n",x,y);}
17 }p[N],tp[N],s[N];
18
19 int n,m;
20
21 inline PO operator +(PO a,PO b)
22 {
23     a.x+=b.x; a.y+=b.y;
24     return a;
25 }
26
27 inline PO operator -(PO a,PO b)
28 {
29     a.x-=b.x; a.y-=b.y;
30     return a;
31 }
32
33 inline PO operator *(PO a,double k)
34 {
35     a.x*=k; a.y*=k;
36     return a;
37 }
38
39 inline PO operator /(PO a,double k)
40 {
41     a.x/=k; a.y/=k;
42     return a;
43 }
44
45 inline int dc(double x)
46 {
47     if(x>EPS) return 1;
48     else if(x<-EPS) return -1;
49     return 0;
50 }
51
52 inline double cross(const PO &a,const PO &b,const PO &c)
53 {
54     return (b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y);
55 }
56
57 inline double dot(const PO &a,const PO &b,const PO &c)
58 {
59     return (b.x-a.x)*(c.x-a.x)+(b.y-a.y)*(c.y-a.y);
60 }
61
62 inline PO getpoint(const PO &a,const PO &b,const PO &c,const PO &d)
63 {
64     double k1=cross(a,d,c),k2=cross(b,c,d);
65     return a+(b-a)*k1/(k1+k2);
66 }
67
68 inline bool onseg(const PO &a,const PO &b,const PO &c)
69 {
70     if(dc(dot(a,b,c))<=0) return true;
71     return false;
72 }
73
75 {
76     scanf("%d",&n);
77     for(int i=1;i<=n;i++) scanf("%lf",&p[i].x);
78     for(int i=1;i<=n;i++) scanf("%lf",&p[i].y);
79 }
80
81 inline void getcut()
82 {
83     tp[1].x=tp[5].x=-INF; tp[1].y=tp[5].y=-INF;
84     tp[2].x=INF,tp[2].y=-INF;
85     tp[3].x=INF,tp[3].y=INF;
86     tp[4].x=-INF,tp[4].y=INF;
87     int cp=4,tc;
88     for(int i=1;i<n;i++)
89     {
90         tc=0;
91         for(int j=1;j<=cp;j++)
92         {
93             if(dc(cross(p[i],p[i+1],tp[j]))>=0) s[++tc]=tp[j];
94             if(dc(cross(p[i],p[i+1],tp[j])*cross(p[i],p[i+1],tp[j+1]))<0)
95                 s[++tc]=getpoint(p[i],p[i+1],tp[j],tp[j+1]);
96         }
97         s[tc+1]=s[1];
98         for(int j=1;j<=tc+1;j++) tp[j]=s[j];
99         cp=tc;
100     }
101     m=cp;
102 }
103
104 inline void go()
105 {
106     getcut();
107     double ans=INF;
108     PO s1,t1,jd;
109     for(int i=1;i<=n;i++)
110     {
111         s1=p[i]; t1.x=s1.x,t1.y=520.1314;
112         for(int j=1;j<=m;j++)
113         {
114             jd=getpoint(s1,t1,s[j],s[j+1]);
115             if(onseg(jd,s[j],s[j+1])) ans=min(ans,jd.y-p[i].y);
116         }
117     }
118     for(int i=1;i<=m;i++)
119     {
120         s1=s[i]; t1.x=s[i].x; t1.y=520.1314;
121         for(int j=1;j<n;j++)
122         {
123             jd=getpoint(s1,t1,p[j],p[j+1]);
124             if(onseg(jd,p[j],p[j+1])) ans=min(ans,s[i].y-jd.y);
125         }
126     }
127     printf("%.3lf\n",ans);
128 }
129
130 int main()
131 {
134 }