• 计算几何初步


    昨天学习了一下计算几何,各种公式欲仙欲死~

    顺便吐槽一句,写计算几何是个体力活...

    Morley's Theorem

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstdlib>
     4 #include<cstring>
     5 #include<ctime>
     6 #include<cmath>
     7 #include<algorithm>
     8 #include<iomanip>
     9 #include<queue>
    10 #include<set>
    11 #include<map>
    12 using namespace std;
    13 #define LL long long
    14 #define FILE "dealing"
    15 #define mid ((l+r)>>1)
    16 #define pii pair<LL,LL>
    17 #define up(i,j,n) for(LL i=(j);i<=(n);++i)
    18 #define poi vec
    19 #define ldb long double
    20 LL read(){
    21     LL x=0,f=1,ch=getchar();
    22     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    23     while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
    24     return f*x;
    25 }
    26 const ldb eps=1e-14;
    27 struct vec{
    28     ldb x,y;
    29     vec(ldb x=0,ldb y=0):x(x),y(y){}
    30 }a,b,c;
    31 vec operator+(vec a,vec b){return vec(a.x+b.x,a.y+b.y);}
    32 vec operator-(vec a,vec b){return vec(a.x-b.x,a.y-b.y);}
    33 vec operator*(vec a,ldb b){return vec(a.x*b,a.y*b);}
    34 vec operator/(vec a,ldb b){return vec(a.x/b,a.y/b);}
    35 int dcmp(ldb a){if(a<eps)return 0;return a<0?-1:1;}
    36 bool operator==(vec a,vec b){return !dcmp(a.x-b.x)&&!dcmp(a.y-b.y);}
    37 ldb dot(vec a,vec b){return a.x*b.x+a.y*b.y;}
    38 ldb len(vec a){return sqrt(dot(a,a));}
    39 ldb ang(vec a,vec b){return acos(dot(a,b)/len(a)/len(b));}
    40 ldb cro(vec a,vec b){return a.x*b.y-a.y*b.x;}
    41 void put(vec a){printf("%.6lf %.6lf ",a.x,a.y);}
    42 void read(vec& a){a.x=read(),a.y=read();}
    43 vec getpoi(vec a,vec b,vec c,vec d){
    44     vec e=a-c;
    45     ldb t=cro(d,e)/cro(b,d);
    46     return a+b*t;
    47 }
    48 vec rot(vec a,ldb rad){return vec(a.x*cos(rad)-a.y*sin(rad),a.x*sin(rad)+a.y*cos(rad));}
    49 int main(){
    50     freopen("dealing.in","r",stdin);
    51     freopen("dealing.out","w",stdout);
    52     int t=read();
    53     while(t--){
    54         read(a),read(b),read(c);
    55         vec bc=c-b,ba=a-b,ca=a-c,ab=b-a,ac=c-a,cb=b-c;
    56         ldb abc3=ang(bc,ba)/3;
    57         vec bd=rot(bc,abc3);
    58         vec cd=rot(ca,2*ang(cb,ca)/3);
    59         vec d=getpoi(b,bd,c,cd);
    60         vec e=getpoi(c,rot(ca,ang(bc*-1,ca)/3),a,rot(ab,ang(ab,ac)/3*2));
    61         vec f=getpoi(b,rot(bc,abc3*2),a,rot(ab,ang(ab,ac)/3));
    62         printf("%.6lf %.6lf %.6lf %.6lf %.6lf %.6lf
    ",d.x,d.y,e.x,e.y,f.x,f.y);
    63     }
    64     return 0;
    65 }
    View Code

    很奇怪的风格...

     Triangle Fun

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstdlib>
     4 #include<cstring>
     5 #include<ctime>
     6 #include<cmath>
     7 #include<algorithm>
     8 #include<iomanip>
     9 #include<queue>
    10 #include<set>
    11 #include<map>
    12 using namespace std;
    13 #define LL long long
    14 #define FILE "dealing"
    15 #define mid ((l+r)>>1)
    16 #define pii pair<int,int>
    17 #define up(i,j,n) for(int i=(j);i<=(n);++i)
    18 #define db double
    19 const double eps=1e-10;
    20 const int maxn=1010000,mod=998244353;
    21 int read(){
    22     int x=0,f=1,ch=getchar();
    23     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    24     while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
    25     return f*x;
    26 }
    27 struct vec{
    28     db x,y;
    29     vec(db x=0,db y=0):x(x),y(y){}
    30 };
    31 vec operator+(vec a,vec b){return vec(a.x+b.x,a.y+b.y);}
    32 vec operator-(vec a,vec b){return vec(a.x-b.x,a.y-b.y);}
    33 vec operator*(vec a,db b){return vec(a.x*b,a.y*b);}
    34 vec operator/(vec a,db b){return vec(a.x/b,a.y/b);}
    35 int dcmp(db a){if(fabs(a)<eps)return 0;return a<0?-1:1;}
    36 bool operator==(vec a,vec b){return !dcmp(a.x-b.x)&&!dcmp(a.y-b.y);}
    37 db dot(vec a,vec b){return a.x*b.x+a.y*b.y;}
    38 db len(vec a){return sqrt(dot(a,a));}
    39 db cro(vec a,vec b){return a.x*b.y-a.y*b.x;}
    40 vec getsection(vec a,vec b,vec c,vec d){
    41     vec p=a-c;
    42     db t=cro(d,p)/cro(b,d);
    43     return p+b*t;
    44 }
    45 db are(vec a,vec b,vec c){
    46     vec d=b-a,e=c-a;
    47     return fabs(cro(d,e))/4;
    48 }
    49 int main(){
    50     freopen(FILE".in","r",stdin);
    51     freopen(FILE".out","w",stdout);
    52     int n=read();
    53     while(n--){
    54         vec a,b,c,d,e,f;
    55         scanf("%lf%lf%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y,&c.x,&c.y);
    56         d=(c-b)/3+b;e=(a-c)/3+c;f=(b-a)/3+a;
    57         vec be=e-b,cf=f-c,ad=d-a;
    58         vec p=getsection(b,be,a,ad);
    59         vec q=getsection(c,cf,b,be);
    60         vec r=getsection(c,cf,a,ad);
    61         printf("%.0lf
    ",are(p,q,r));
    62     }
    63     return 0;
    64 }
    View Code

    还有几个不太好记的函数:

    db dtoline(vec p,vec a,vec b){return fabs(cro(p-a,p-b))/len(b-a);}
    db dtoseg(vec p,vec a,vec b){
    	if(dcmp(dot(b-a,p-a))<0)return len(a-p);
    	else if(dcmp(dot(a-b,p-b)<0))return len(b-p);
    	else return dtoline(p,a,b);
    }
    vec linepro(vec p,vec a,vec b){
    	vec v=b-a;return a+v*(dot(p,v)/dot(v,v));
    }
    bool shifouxiangjiao(vec a1,vec a2,vec b1,vec b2){
    	db v1=cro(a2-a1,b1-a1),v2=cro(a2-a1,b2-a1),
    	v3=cro(b2-b1,a1-b1),v4=cro(b2-b1,a2-b1);
    	return dcmp(v1)*dcmp(v2)<0&&dcmp(v3)*dcmp(v4)<0;
    }
    bool shifouzaixianduanshang(vec p,vec a,vec b){
    	return dcmp(cro(a-p,b-p))==0&&dcmp(dot(a1-p,a2-p))<0;
    }
    

    Board Wrapping

    做的第一道凸包题,怎么调也调不过去,结果发现模板错了...

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstdlib>
     4 #include<cstring>
     5 #include<ctime>
     6 #include<cmath>
     7 #include<algorithm>
     8 #include<iomanip>
     9 #include<queue>
    10 #include<set>
    11 #include<map>
    12 using namespace std;
    13 #define LL long long
    14 #define FILE "dealing"
    15 #define mid ((l+r)>>1)
    16 #define pii pair<int,int>
    17 #define up(i,j,n) for(int i=(j);i<=(n);++i)
    18 #define db double
    19 #define poi vec
    20 const double eps=1e-10;
    21 const int maxn=10100,mod=998244353;
    22 int read(){
    23     int x=0,f=1,ch=getchar();
    24     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    25     while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
    26     return f*x;
    27 }
    28 int T=0;
    29 const db pi=acos(-1.0); 
    30 struct vec{
    31     db x,y;
    32     vec(db x=0,db y=0):x(x),y(y){}
    33 };
    34 vec operator+(vec a,vec b){return vec(a.x+b.x,a.y+b.y);}
    35 vec operator-(vec a,vec b){return vec(a.x-b.x,a.y-b.y);}
    36 vec operator*(vec a,db b){return vec(a.x*b,a.y*b);}
    37 vec operator/(vec a,db b){return vec(a.x/b,a.y/b);}
    38 int dcmp(db a){if(fabs(a)<=eps)return 0;return a<0?-1:1;}
    39 bool operator==(vec a,vec b){return !dcmp(a.x-b.x)&&!dcmp(a.y-b.y);}
    40 bool operator<(vec a,vec b){return a.x<b.x||(!dcmp(a.x-b.x)&&a.y<b.y);}
    41 db dot(vec a,vec b){return a.x*b.x+a.y*b.y;}
    42 db len(vec a){return sqrt(dot(a,a));}
    43 db cro(vec a,vec b){return a.x*b.y-a.y*b.x;}
    44 bool shifouzaixianduanshang(vec p,vec a,vec b){return dcmp(cro(a-p,b-p))==0&&dcmp(dot(a-p,b-p))<0;}
    45 vec rot(vec a,db b){return vec(a.x*cos(b)-a.y*sin(b),a.x*sin(b)+a.y*cos(b));}
    46 vec ang(vec a,vec b){return acos(dot(a,b)/len(a)/len(b));}
    47 vec ch[maxn],a[maxn];
    48 int qiutubao(int n){
    49     int m=0,k=0;
    50     sort(a+1,a+n+1);
    51     up(i,1,n){
    52         while(m>=2&&cro(ch[m]-ch[m-1],a[i]-ch[m-1])<=0)m--;
    53         ch[++m]=a[i];
    54     }
    55     k=m;
    56     for(int i=n-1;i>=1;i--){
    57         while(m>=k+1&&cro(ch[m]-ch[m-1],a[i]-ch[m-1])<=0)m--;
    58         ch[++m]=a[i];
    59     }
    60     if(n>1)m--;
    61     return m;
    62 }
    63 db torad(db a){return a/180*acos(-1.0);}
    64 int main(){
    65     freopen(FILE".in","r",stdin);
    66     freopen(FILE".out","w",stdout);
    67     int T=read();
    68     while(T--){
    69         int n=read(),cnt=0;
    70         double x,y,w,h,rad,are=0;
    71         up(i,1,n){
    72             scanf("%lf%lf%lf%lf%lf",&x,&y,&w,&h,&rad);
    73             are+=w*h;vec o(x,y);
    74             a[++cnt]=o+rot(vec(w/2,h/2),-torad(rad));
    75             a[++cnt]=o+rot(vec(-w/2,-h/2),-torad(rad));
    76             a[++cnt]=o+rot(vec(-w/2,h/2),-torad(rad));
    77             a[++cnt]=o+rot(vec(w/2,-h/2),-torad(rad));
    78         }
    79         int m=qiutubao(cnt);
    80         db area2=0;
    81         up(i,2,m-1)area2+=cro(ch[i]-ch[1],ch[i+1]-ch[1]);area2/=2;
    82         printf("%.1lf %%
    ",are/area2*100);
    83     }
    84     return 0;
    85 }
    View Code

     Airport

    简单凸包问题;

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstdlib>
     4 #include<cstring>
     5 #include<ctime>
     6 #include<cmath>
     7 #include<algorithm>
     8 #include<iomanip>
     9 #include<queue>
    10 #include<set>
    11 #include<map>
    12 using namespace std;
    13 #define LL long long
    14 #define FILE "dealing"
    15 #define mid ((l+r)>>1)
    16 #define pii pair<int,int>
    17 #define up(i,j,n) for(int i=(j);i<=(n);++i)
    18 #define db double
    19 #define poi vec
    20 const double eps=1e-10;
    21 const int maxn=1010000,mod=998244353,inf=1000000007;
    22 int read(){
    23     int x=0,f=1,ch=getchar();
    24     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    25     while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
    26     return f*x;
    27 }
    28 struct vec{
    29     db x,y;
    30     vec(db x=0,db y=0):x(x),y(y){}
    31 };
    32 vec operator+(vec a,vec b){return vec(a.x+b.x,a.y+b.y);}
    33 vec operator-(vec a,vec b){return vec(a.x-b.x,a.y-b.y);}
    34 vec operator*(vec a,db b){return vec(a.x*b,a.y*b);}
    35 vec operator/(vec a,db b){return vec(a.x/b,a.y/b);}
    36 int dcmp(db a){if(fabs(a)<eps)return 0;return a<0?-1:1;}
    37 bool operator<(const vec& a,const vec& b){return a.x<b.x||(!dcmp(a.x-b.x)&&a.y<b.y);}
    38 db dot(vec a,vec b){return a.x*b.x+a.y*b.y;}
    39 db len(vec a){return sqrt(dot(a,a));}
    40 db cro(vec a,vec b){return a.x*b.y-a.y*b.x;}
    41 vec a[maxn],ch[maxn];
    42 int qiutubao(int n){
    43     int m=0,k;
    44     sort(a+1,a+n+1);
    45     up(i,1,n){
    46         while(m>1&&cro(ch[m-1]-ch[m-2],a[i]-ch[m-2])<0)m--;
    47         ch[m++]=a[i];
    48     }
    49     k=m;
    50     for(int i=n-1;i>=1;i--){
    51         while(m>k&&cro(ch[m-1]-ch[m-2],a[i]-ch[m-2])<0)m--;
    52         ch[m++]=a[i];
    53     }
    54     if(n>1)m--;
    55     return m;
    56 }
    57 void bianchengliangdianshi(vec a,vec b,db& A,db& B,db& C){
    58     if(!dcmp(a.x-b.x))return (void)(A=1,B=0,C=-a.x);
    59     else {
    60         db k=(a.y-b.y)/(a.x-b.x);
    61         A=k,B=-1,C=a.y-k*a.x;
    62     }
    63 }
    64 int main(){
    65     freopen(FILE".in","r",stdin);
    66     freopen(FILE".out","w",stdout);
    67     int T=read();
    68     up(t,1,T){
    69         int n=read();
    70         db X=0,Y=0;
    71         up(i,1,n){
    72             scanf("%lf%lf",&a[i].x,&a[i].y);
    73             X+=a[i].x,Y+=a[i].y;
    74         }
    75         int m=qiutubao(n);
    76         db A,B,C,ans=1e20*1.0,sum;
    77         up(i,0,m-1){
    78             bianchengliangdianshi(ch[i],ch[(i+1)%m],A,B,C);
    79             sum=fabs(X*A+B*Y+n*C)/(sqrt(A*A+B*B));
    80             ans=min(ans,sum);
    81         }
    82         printf("Case #%d: %.3lf
    ",t,ans/n);
    83     }
    84     return 0;
    85 }
    View Code

    The Great Divide

    判断两点集的凸包是否可以用一条直线分开;

    需要判断凸包是否有相交和凸包是否有包含关系;

      1 #include<iostream>
      2 #include<cstdio>
      3 #include<cstdlib>
      4 #include<cstring>
      5 #include<ctime>
      6 #include<cmath>
      7 #include<algorithm>
      8 #include<iomanip>
      9 #include<queue>
     10 #include<set>
     11 using namespace std;
     12 #define ll int
     13 #define db double
     14 #define FILE "dealing"
     15 #define mid ((l+r)>>1)
     16 #define pii pair<ll,ll>
     17 #define up(i,j,n) for(ll i=(j);i<=(n);i++)
     18 int read(){
     19     ll x=0,f=1,ch=getchar();
     20     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
     21     while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
     22     return f*x;
     23 }
     24 const db eps=1e-10;
     25 const int maxn=2000;
     26 struct vec{
     27     db x,y;
     28     vec(db x=0,db y=0):x(x),y(y){}
     29 };
     30 vec operator+(vec a,vec b){return vec(a.x+b.x,a.y+b.y);}
     31 vec operator-(vec a,vec b){return vec(a.x-b.x,a.y-b.y);}
     32 vec operator*(vec a,db b){return vec(a.x*b,a.y*b);}
     33 vec operator/(vec a,db b){return vec(a.x/b,a.y/b);}
     34 int dcmp(db a){if(fabs(a)<eps)return 0;return a<0?-1:1;}
     35 bool operator<(vec a,vec b){return a.x<b.x||(!dcmp(a.x-b.x)&&a.y<b.y);}
     36 bool operator==(vec a,vec b){return !dcmp(a.x-b.x)&&!dcmp(a.y-b.y);}
     37 db dot(vec a,vec b){return a.x*b.x+a.y*b.y;}
     38 db len(vec a){return sqrt(dot(a,a));}
     39 db cro(vec a,vec b){return a.x*b.y-a.y*b.x;}
     40 bool dianzaixianduanshang(vec p,vec a,vec b){
     41     return !dcmp(cro(a-p,b-p))&&dcmp(dot(a-p,b-p))<0;
     42 }
     43 int qiutubao(vec* a,vec* ch,int n){
     44     int m=0,k;
     45     sort(a+1,a+n+1);
     46     up(i,1,n){
     47         while(m>1&&cro(ch[m]-ch[m-1],a[i]-ch[m-1])<=0)m--;
     48         ch[++m]=a[i];
     49     }
     50     k=m;
     51     for(int i=n-1;i>=1;i--){
     52         while(m>k&&cro(ch[m]-ch[m-1],a[i]-ch[m-1])<=0)m--;
     53         ch[++m]=a[i];
     54     }
     55     if(n>1)m--;
     56     return m;
     57 }
     58 bool dianzaiduobianxingneibu(vec p,vec* a,int n){
     59     int wn=0;
     60     up(i,0,n-1){
     61         if(dianzaixianduanshang(p,a[i],a[(i+1)%n]))return 1;
     62         int k=dcmp(cro(a[(i+1)%n]-a[i],p-a[i]));
     63         int d1=dcmp(a[i].y-p.y);
     64         int d2=dcmp(a[(i+1)%n].y-p.y);
     65         if(k>0&&d1<=0&&d2>0)wn++;
     66         if(k<0&&d1>0&&d2<=0)wn--;
     67     }
     68     return !wn?0:1;
     69 }
     70 bool xianduanxiangjiao(vec a1,vec a2,vec b1,vec b2){
     71     int v1=dcmp(cro(a2-a1,b1-a1)),v2=dcmp(cro(a2-a1,b2-a1));
     72     int v3=dcmp(cro(b2-b1,a1-b1)),v4=dcmp(cro(b2-b1,a2-b1));
     73     return v1*v2<0&&v3*v4<0;
     74 }
     75 bool xianduanyuduobianxingxiangjiao(vec a,vec b,vec* ch,int n){
     76     up(i,0,n-1){
     77         if(a==ch[i] || a==ch[(i+1)%n] || b==ch[i] || b==ch[(i+1)%n] )return 1;
     78         if(xianduanxiangjiao(a,b,ch[i],ch[(i+1)%n]))return 1;
     79         if(dianzaixianduanshang(a,ch[i],ch[(i+1)%n])||dianzaixianduanshang(b,ch[i],ch[(i+1)%n]))return 1;
     80     }
     81     return 0;
     82 }
     83 vec a[maxn],b[maxn],c[maxn],d[maxn];
     84 int main(){
     85     freopen(FILE".in","r",stdin);
     86     freopen(FILE".out","w",stdout);
     87     int n,m,nn,mm;
     88     while(scanf("%d%d",&n,&m)==2&&(n||m)){
     89         bool flag=0;
     90         up(i,1,n)scanf("%lf%lf",&a[i].x,&a[i].y);
     91         up(i,1,m)scanf("%lf%lf",&b[i].x,&b[i].y);
     92         nn=qiutubao(a,c,n);mm=qiutubao(b,d,m);
     93         up(i,1,nn)if(dianzaiduobianxingneibu(c[i],d+1,mm)){printf("No
    ");flag=1;break;}if(flag)continue;
     94         up(i,1,mm)if(dianzaiduobianxingneibu(d[i],c+1,nn)){printf("No
    ");flag=1;break;}if(flag)continue;
     95         up(i,1,nn-1)if(xianduanyuduobianxingxiangjiao(c[i],c[i+1],d+1,mm)){printf("No
    ");flag=1;break;}if(flag)continue;
     96         if(xianduanyuduobianxingxiangjiao(c[nn],c[1],d+1,mm)){printf("No
    ");flag=1;break;}if(flag)continue;
     97         up(i,1,mm-1)if(xianduanyuduobianxingxiangjiao(d[i],d[i+1],c+1,nn)){printf("No
    ");flag=1;break;}if(flag)continue;
     98         if(xianduanyuduobianxingxiangjiao(d[mm],d[1],c+1,nn)){printf("No
    ");flag=1;break;}if(flag)continue;
     99         printf("Yes
    ");
    100     }
    101     return 0;
    102 }
    View Code

    Squares

    旋转卡(qia)壳第一题,模板题。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstdlib>
     4 #include<cstring>
     5 #include<ctime>
     6 #include<cmath>
     7 #include<algorithm>
     8 #include<iomanip>
     9 #include<queue>
    10 #include<set>
    11 using namespace std;
    12 #define ll int
    13 #define db double
    14 #define FILE "dealing"
    15 #define mid ((l+r)>>1)
    16 #define pii pair<ll,ll>
    17 #define up(i,j,n) for(ll i=(j);i<=(n);i++)
    18 int read(){
    19     ll x=0,f=1,ch=getchar();
    20     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    21     while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
    22     return f*x;
    23 }
    24 const db eps=1e-10;
    25 const int maxn=402000;
    26 struct vec{
    27     db x,y;
    28     vec(db x=0,db y=0):x(x),y(y){}
    29 };
    30 vec operator+(vec a,vec b){return vec(a.x+b.x,a.y+b.y);}
    31 vec operator-(vec a,vec b){return vec(a.x-b.x,a.y-b.y);}
    32 vec operator*(vec a,db b){return vec(a.x*b,a.y*b);}
    33 vec operator/(vec a,db b){return vec(a.x/b,a.y/b);}
    34 int dcmp(db a){if(fabs(a)<eps)return 0;return a<0?-1:1;}
    35 bool operator<(vec a,vec b){return a.x<b.x||(!dcmp(a.x-b.x)&&a.y<b.y);}
    36 bool operator==(vec a,vec b){return !dcmp(a.x-b.x)&&!dcmp(a.y-b.y);}
    37 db dot(vec a,vec b){return a.x*b.x+a.y*b.y;}
    38 db len(vec a){return sqrt(dot(a,a));}
    39 db cro(vec a, vec b){return a.x*b.y-a.y*b.x;}
    40 db are(vec a,vec b,vec c){return fabs(cro(a-b,c-b));}
    41 vec a[maxn],b[maxn],c[maxn],d[maxn];
    42 int qiutubao(vec* a,vec* ch,int n){
    43     int m=0,k;sort(a+1,a+n+1);
    44     up(i,1,n){
    45         while(m>1&&cro(ch[m]-ch[m-1],a[i]-ch[m-1])<0)m--;
    46         ch[++m]=a[i];
    47     }
    48     k=m;
    49     for(int i=n-1;i>=1;i--){
    50         while(m>k&&cro(ch[m]-ch[m-1],a[i]-ch[m-1])<0)m--;
    51         ch[++m]=a[i];
    52     }
    53     if(n>1)m--;
    54     return m;
    55 }
    56 db qiuxuanzhuanqiake(vec* a,int n){
    57     int m=0,p=0;
    58     if(n<=3){
    59         db ans=0;up(i,0,n-1)ans=max(ans,len(a[i]-a[(i+1)%n]));
    60         return ans;
    61     }
    62     up(i,2,n-1)if(are(a[0],a[1],a[i])>are(a[0],a[1],a[(i+1)%n])){p=i;break;}
    63     db ans=max(len(a[0]-a[p]),len(a[1]-a[p]));
    64     up(i,1,n-1){
    65         while(are(a[i],a[(i+1)%n],a[p%n])<are(a[i],a[(i+1)%n],a[(p+1)%n]))p++;
    66         ans=max(ans,max(len(a[i]-a[p%n]),len(a[p%n]-a[(i+1)%n])));
    67     }
    68     return ans;
    69 }
    70 int main(){
    71     freopen(FILE".in","r",stdin);
    72     freopen(FILE".out","w",stdout);
    73     int T=read();
    74     while(T--){
    75         int n=read(),m=0;db x,y,w;
    76         up(i,1,n){
    77             scanf("%lf%lf%lf",&x,&y,&w);vec o(x,y);
    78             a[++m]=o;
    79             a[++m]=o+vec(w,w);
    80             a[++m]=o+vec(w,0);
    81             a[++m]=o+vec(0,w);
    82         }
    83         sort(a+1,a+m+1);
    84         m=unique(a+1,a+m+1)-a-1;
    85         int mm=qiutubao(a,b,m);
    86         db ans=qiuxuanzhuanqiake(b+1,mm);ans=ans*ans+0.2;
    87         printf("%.0lf
    ",ans);
    88     }
    89     return 0;
    90 }
    View Code

     Most Distant Point from the Sea

    半平面交简单题。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstdlib>
     4 #include<string>
     5 #include<cstring>
     6 #include<cmath>
     7 #include<ctime>
     8 #include<algorithm>
     9 #include<iomanip>
    10 #include<set>
    11 #include<map>
    12 #include<queue>
    13 using namespace std;
    14 #define LL long long
    15 #define up(i,j,n) for(int i=(j);i<=(n);i++)
    16 #define FILE "dealing"
    17 #define poi vec
    18 #define eps 1e-10
    19 #define db double 
    20 const int maxn=101000,inf=1000000000,mod=1000000007;
    21 struct vec {
    22     db x,y;
    23     vec (db x=0,db y=0):x(x),y(y){}
    24 };
    25 struct line{
    26     db ang;vec p,v;
    27     line(){}
    28     line(vec p,vec v):p(p),v(v){ang=atan2(v.y,v.x);}
    29     bool operator<(const line& b)const{return ang<b.ang;}
    30 };
    31 vec operator+(vec a,vec b){return vec(a.x+b.x,a.y+b.y);}
    32 vec operator-(vec a,vec b){return vec(a.x-b.x,a.y-b.y);}
    33 vec operator*(vec a,db b){return vec(a.x*b,a.y*b);}
    34 vec operator/(vec a,db b){return vec(a.x/b,a.y/b);}
    35 int dcmp(db a){if(fabs(a)<eps)return 0;return a<0?-1:1;}
    36 bool operator==(const vec& a,const vec& b){return !dcmp(a.x-b.x)&&!dcmp(a.y-b.y);}
    37 db cro(vec a,vec b){return a.x*b.y-a.y*b.x;}
    38 db dot(vec a,vec b){return a.x*b.x+a.y*b.y;}
    39 db len(vec a){return sqrt(dot(a,a));}
    40 bool onleft(line l,vec p){return cro(l.v,p-l.p)>0;}
    41 vec qiuliangzhixianjiaodian(line a,line b){
    42     vec u=a.p-b.p;
    43     return a.p+a.v*(cro(b.v,u)/cro(a.v,b.v));
    44 }
    45 int qiubanpingmianjiao(line* l,int n,vec* ch){
    46     sort(l,l+n);
    47     vec* p=new vec[n];
    48     line* q=new line[n];
    49     int first,last;
    50     q[first=last=0]=l[0];
    51     up(i,1,n-1){
    52         while(first<last&&!onleft(l[i],p[last-1]))last--;
    53         while(first<last&&!onleft(l[i],p[first]))first++;
    54         q[++last]=l[i];
    55         if(fabs(cro(q[last].v,q[last-1].v))<eps){
    56             last--;
    57             if(onleft(q[last],l[i].p))q[last]=l[i];
    58         }
    59         if(first<last)p[last-1]=qiuliangzhixianjiaodian(q[last],q[last-1]);
    60     }
    61     while(first<last&&!onleft(q[first],p[last-1]))last--;
    62     if(last-first<=1)return 0;
    63     p[last]=qiuliangzhixianjiaodian(q[last],q[first]);
    64     int m=0;
    65     up(i,first,last)ch[m++]=p[i];
    66     return m;
    67 }
    68 vec normal(vec a){return vec(-a.y/len(a),a.x/len(a));}
    69 int n;
    70 vec a[maxn],b[maxn],v[maxn],v2[maxn],c[maxn];
    71 line l[maxn];
    72 int main(){
    73     freopen(FILE".in","r",stdin);
    74     freopen(FILE".out","w",stdout);
    75     while(scanf("%d",&n)&&n){
    76         up(i,0,n-1)scanf("%lf%lf",&a[i].x,&a[i].y);
    77         up(i,0,n-1){
    78             v[i]=a[(i+1)%n]-a[i];
    79             v2[i]=normal(v[i]);
    80         }
    81         db left=0,right=20000;
    82         while(right-left>1e-8){
    83             db mid=(left+right)/2;
    84             up(i,0,n-1)l[i]=line(v2[i]*mid+a[i],v[i]);
    85             int m=qiubanpingmianjiao(l,n,c);
    86             if(!m)right=mid;
    87             else left=mid;
    88         }
    89         printf("%.6lf
    ",left);
    90     }
    91     return 0;
    92 }
    View Code

    【bzoj1038】[ZJOI2008]瞭望塔

    半平面交简单题,主要的问题在于求出凸壳与山的最小距离;
    可以证明凸壳与山的最小距离必定在凸壳与山的顶点处,用STL的lower_bound来找到最接近某个x值的两点。
    如果数据增强到1e5以上,敲平衡树?码农...
      1 #include<iostream>
      2 #include<cstdio>
      3 #include<cstdlib>
      4 #include<string>
      5 #include<cstring>
      6 #include<cmath>
      7 #include<ctime>
      8 #include<algorithm>
      9 #include<iomanip>
     10 #include<set>
     11 #include<map>
     12 #include<queue>
     13 using namespace std;
     14 #define LL long long
     15 #define up(i,j,n) for(int i=(j);i<=(n);i++)
     16 #define FILE "dealing"
     17 #define poi vec
     18 #define eps 1e-10
     19 #define db double 
     20 const int maxn=101000,inf=1000000000,mod=1000000007;
     21 int read(){
     22     int x=0,f=1,ch=getchar();
     23     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
     24     while(ch<='9'&&ch>='0'){x=(x<<1)+(x<<3)+ch-'0',ch=getchar();}
     25     return f*x;
     26 }
     27 struct vec {
     28     db x,y;
     29     vec(db x=0,db y=0):x(x),y(y){}
     30 };
     31 struct line{
     32     vec p,v;db ang;
     33     line(){}
     34     line(vec p,vec v):p(p),v(v){ang=atan2(v.y,v.x);}
     35     bool operator<(const line& b)const{return ang<b.ang;}
     36 };
     37 vec operator+(vec a,vec b){return vec (a.x+b.x,a.y+b.y);}
     38 vec operator-(vec a,vec b){return vec (a.x-b.x,a.y-b.y);}
     39 vec operator*(vec a,db b){return vec (a.x*b,a.y*b);}
     40 vec operator/(vec a,db b){return vec (a.x/b,a.y/b);}
     41 int dcmp(db a){if(fabs(a)<eps)return 0;return a<0?-1:1;}
     42 bool operator==(vec a,vec b){return !dcmp(a.x-b.x)&&!dcmp(a.y-b.y);}
     43 bool operator<(const vec& a,const vec& b){return a.x<b.x||(!dcmp(a.x-b.x)&&a.y<b.y);}
     44 db cro(vec a,vec b){return a.x*b.y-a.y*b.x;}
     45 db dot(vec a,vec b){return a.x*b.x+a.y*b.y;}
     46 db len(vec a){return sqrt(dot(a,a));}
     47 vec qiuliangzhixianjiaodian(line a,line b){
     48     vec u=a.p-b.p;
     49     return a.p+a.v*(cro(b.v,u)/cro(a.v,b.v));
     50 }
     51 bool onleft(line l,vec p){return cro(l.v,p-l.p)>0;}
     52 int qiubanpingmianjiao(line* l,int n,vec* ch){
     53     sort(l,l+n);
     54     int first=0,last=0;
     55     vec* p=new vec[n];
     56     line* q=new line[n];
     57     q[0]=l[0];
     58     up(i,1,n-1){
     59         while(first<last&&!onleft(l[i],p[last-1]))last--;
     60         while(first<last&&!onleft(l[i],p[first]))first++;
     61         q[++last]=l[i];
     62         if(fabs(cro(q[last].v,q[last-1].v))<eps){
     63             last--;
     64             if(onleft(q[last],l[i].p))q[last]=l[i];
     65         }
     66         if(first<last)p[last-1]=qiuliangzhixianjiaodian(q[last],q[last-1]);
     67     }
     68     while(first<last&&!onleft(q[first],p[last-1]))last--;
     69     if(last-first<=1)return 0;
     70     p[last]=qiuliangzhixianjiaodian(q[last],q[first]);
     71     int m=0;
     72     up(i,first,last)ch[m++]=p[i];
     73     return m;
     74 }
     75 int a[maxn],b[maxn];
     76 vec v[maxn],c[maxn];
     77 line l[maxn];
     78 db qiu(vec a,vec b,db x){
     79     if(dcmp(a.x-b.x)==0)return 1e17;
     80     db k=(a.y-b.y)/(a.x-b.x);
     81     db bb=a.y-a.x*k;
     82     return k*x+bb;
     83 }
     84 int main(){
     85     freopen(FILE".in","r",stdin);
     86     freopen(FILE".out","w",stdout);
     87     int n=read();
     88     up(i,0,n-1)a[i]=read();
     89     up(i,0,n-1)b[i]=read();
     90     up(i,0,n-1)v[i]=vec(a[i],b[i]);
     91     up(i,0,n-2)l[i]=line(v[i],v[i+1]-v[i]);
     92     int nn=n-1;
     93     l[nn++]=line(vec(0,-1e14),vec(1,0));
     94     l[nn++]=line(vec(0,1e14),vec(-1,0));
     95     l[nn++]=line(vec(1e14,0),vec(0,1));
     96     l[nn++]=line(vec(-1e14,0),vec(0,-1));
     97     int m=qiubanpingmianjiao(l,nn,c);
     98     db minn=1e14;
     99     up(i,0,m-1)
    100         if(c[i].x>=a[0]&&c[i].x<=a[n-1]){
    101             int pos=lower_bound(a,a+n,c[i].x)-a;
    102             db gao=qiu(v[pos-1],v[pos],c[i].x);
    103             minn=min(minn,c[i].y-gao);
    104         }
    105     up(i,0,n-1){
    106         vec t(v[i].x,-1e14);
    107         int pos=lower_bound(c,c+m,t)-c;
    108         if((pos==0&&c[m-1].x>v[i].x)||(pos==m))continue;
    109         db gao=qiu(c[(pos-1+m)%m],c[pos],v[i].x);
    110         minn=min(minn,gao-v[i].y);
    111     }
    112     printf("%.3lf
    ",minn);
    113     return 0;
    114 }
    View Code
  • 相关阅读:
    segnet 编译与测试
    ubuntu(已经配置了python2+opencv)简易配置python3的opencv:
    OCR光学字符识别--STN-OCR 测试
    阿里云图形界面
    win10+UEFI下u盘安装ubuntu16.04
    ubuntu16.04+cuda8.0+cudnn5.0+caffe
    Angular 组件通讯、生命周期钩子 小结
    Angular 路由⑦要素
    关于克隆gitlab项目的一些 问题列表
    RxJS学习笔记
  • 原文地址:https://www.cnblogs.com/chadinblog/p/6410360.html
Copyright © 2020-2023  润新知