凸包(旋转卡壳)

计算几何模板

struct ConvexHull
{
    const static int __=1e5+5;

    point ch[__];int n;

    static bool cmp(const point &x,const point &y)
    {
        if(x.x==y.x)
            return x.y=lim && ((p-ch[n-1])^(ch[n]-ch[n-1]))>0)
            --n;
        ch[++n].set(p.x,p.y);
    }

    ConvexHull() {clear();}

    void get_ConvexHull(point p[],int np)
    {
        sort(p+1,p+1+np,cmp);
        n=0;
        for(int i=1;i<=np;++i)
            add(p[i],2);
        for(int i=np-1,j=n;i>=1;--i)
            add(p[i],j+1);
        --n;
    }

    //周长(若凸包为直线需要除以2)
    double circumference()
    {
        ch[n+1]=ch[1];
        double res=0.0;
        for(int i=1;i<=n;++i)
            res+=line(ch[i],ch[i+1]).length();
        return res;
    }

    void print()
    {
        for(int i=1;i<=n;++i)
            printf("%.2f %.2f\n",(double)ch[i].x,(double)ch[i].y);
    }

    void clear(){n=0;}
}C;

旋转卡壳:

struct point
{
    ll x,y;
    point(ll x=0,ll y=0):
        x(x),y(y) {}
    friend ll operator*(const point& a,const point& b)
    {
        return a.x*b.y-a.y*b.x;
    }
};

point p[100005],tb[100005];

bool cmp(const point& a,const point& b)
{
    if(a.x==b.x)return a.ya
{
    return point(a.x-b.x,a.y-b.y);
}

int tubao(int n)
{
    sort(p+1,p+n+1,cmp);
    int m=0;
    for(int i=1; i<=n; i++)
    {
        while(m>1 && xl(p[i],tb[m-2])*xl(tb[m-1],tb[m-2])>=0)m--;
        tb[m++]=p[i];
    }
    int temp=m;
    for(int i=n-1; i>=1; i--)
    {
        while(m>temp && xl(p[i],tb[m-2])*xl(tb[m-1],tb[m-2])>=0)m--;
        tb[m++]=p[i];
    }
    if(n>1)m--;
//  for(int i=0;i

题目链接:面积最大的三角形

旋转卡壳:

struct point
{
    ll x,y;
    point(ll x=0,ll y=0):
        x(x),y(y) {}
    friend ll operator*(const point& a,const point& b)
    {
        return a.x*b.y-a.y*b.x;
    }
};

point p[50005],tb[50005];

bool cmp(const point& a,const point& b)
{
    if(a.x==b.x)return a.ya
{
    return point(a.x-b.x,a.y-b.y);
}

int tubao(int n)
{
    sort(p+1,p+n+1,cmp);
    int m=0;
    for(int i=1; i<=n; i++)
    {
        while(m>1 && xl(p[i],tb[m-2])*xl(tb[m-1],tb[m-2])>=0)m--;
        tb[m++]=p[i];
    }
    int temp=m;
    for(int i=n-1; i>=1; i--)
    {
        while(m>temp && xl(p[i],tb[m-2])*xl(tb[m-1],tb[m-2])>=0)m--;
        tb[m++]=p[i];
    }
    if(n>1)m--;
// for(int i=0;i=cross(tb[i],tb[(fir+1)%m],tb[sec]))
                &&(cross(tb[i],tb[fir],tb[sec])>=cross(tb[i],tb[fir],tb[(sec+1)%m])))
                    break;
            }
            ans=max(ans,fabs(cross(tb[i],tb[fir],tb[sec]))/2.0);
        }
        printf("%.2f\n",ans);
    }
    return 0;
}

你可能感兴趣的:(凸包(旋转卡壳))