zoukankan      html  css  js  c++  java
  • 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  
     74 inline void read()
     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 {
    132     read(),go();
    133     return 0;
    134 }
  • 相关阅读:
    Android sqlite日期存储
    Ubuntu10.04中间Leach协议一键安装
    Chapter 1 Securing Your Server and Network(1):选择SQL Server业务经理
    lua迭代器和仿制药for
    设定值范围+区间覆盖
    新手可以学习cocos2dx 3.0 组态(两)
    王立平--string.Empty
    Javascript操作阵列
    Dojo仪表板
    时间复杂度
  • 原文地址:https://www.cnblogs.com/proverbs/p/2945083.html
Copyright © 2011-2022 走看看