• bzoj1038(半平面交)


    #include<iostream>
    #include<cstring>
    #include<cmath>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    const int maxn=1005;
    const double eps=1e-12;
    double ans=1e10;
    int n,head,tail;
    struct vec{
        double x,y;
        vec(double x=0,double y=0):x(x),y(y){}
        vec operator-(vec& a){
            return vec(x-a.x,y-a.y);
        }
        vec operator+(vec&a){
            return vec(x+a.x,y+a.y);
        }
    }po[maxn],g[maxn];
    vec operator*(vec a,double t){return vec(a.x*t,a.y*t);}
    double cross(vec a,vec b){return a.x*b.y-b.x*a.y;}
    struct lin{
        vec p,v;//p是直线上一个点,v是方向向量 
        double ang;//ang是斜率;
        lin(){} 
        lin(vec p,vec v):p(p),v(v){ang=atan2(v.y,v.x);}
        bool operator<(const lin&a)const{
            return ang<a.ang;
        }
    }ll[maxn],q[maxn],bb,cc;
    bool onl(lin L,vec p){
        return cross(L.v,p-L.p)>0;
    }
    vec qj(lin a,lin b){
        vec u=a.p-b.p;
        double t=cross(b.v,u)/cross(a.v,b.v);
        return a.v*t+a.p;
    }
    void halfj(){
        sort(ll,ll+n);
        q[head=tail=0]=ll[0];
        for(int i=1;i<n;++i){
            while(head<tail&&!onl(ll[i],g[tail-1]))tail--;
            while(head<tail&&!onl(ll[i],g[head]))head++;
            q[++tail]=ll[i];
            if(fabs(cross(q[tail].v,q[tail-1].v))<eps){
                --tail;if(onl(q[tail],ll[i].p))q[tail]=ll[i];
            }
            if(head<tail)g[tail-1]=qj(q[tail-1],q[tail]);
        }
        while(head<tail&&!onl(q[head],g[tail-1]))--tail;
    }
    int main(){
        cin>>n;
        for(int i=1;i<=n;++i){
            scanf("%lf",&po[i].x);
        }
        for(int i=1;i<=n;++i){
            scanf("%lf",&po[i].y);
        }
        po[0].x=po[1].x;po[0].y=100001;
        po[n+1].x=po[n].x;po[n+1].y=100001;
        for(int i=0;i<=n;++i){
            ll[i]=lin(po[i],po[i+1]-po[i]);
        }
        n+=1;
        halfj();
        for(int k=0;k<tail;++k)
            for(int i=1;i<n-1;++i){
                vec tmp;tmp.x=g[k].x;tmp.y=-1;
                if(g[k].x>=po[i].x&&g[k].x<=po[i+1].x){
                    cc=lin(po[i],po[i+1]-po[i]);
                    bb=lin(tmp,g[k]-tmp); 
                    ans=min(ans,g[k].y-qj(cc,bb).y);
                }
        }
        for(int k=1;k<=n-1;++k)
            for(int i=0;i<tail-1;++i){
                vec tmp;tmp.x=po[k].x;tmp.y=-1;
                if(po[k].x>=g[i].x&&po[k].x<=g[i+1].x){
                    cc=lin(g[i],g[i+1]-g[i]);
                    bb=lin(tmp,po[k]-tmp);
                    ans=min(ans,qj(cc,bb).y-po[k].y);
                }        
        }
        printf("%.3lf",ans);
        return 0;
    } 
  • 相关阅读:
    Linux netstat命令详解
    【转】Jenkins怎么启动和停止服务
    Jenkins权限配置失误后导致登录失败的解决办法
    Linux下查看某一进程所占用内存的方法
    Linux集群配置ntp时间同步服务
    Linux下安装MySQL数据库
    Redis集群的部署
    Linux下安装Nginx服务器
    为Linux服务器设置静态IP的方法
    vSphere Client无法连接到服务器 出现未知错误的解决方法
  • 原文地址:https://www.cnblogs.com/dibaotianxing/p/8639465.html
Copyright © 2020-2023  润新知