凸包(旋转卡壳)

计算几何模板

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<y.y;
        return x.x<y.x;
    }

    point& operator[](int x){return ch[x];}

    void add(point &p,int lim)
    {
        while(n>=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.y<b.y;
    return a.x<b.x;
}

double cross(const point& st,const point& fir,const point& sec)
{
    double x1=fir.x-st.x,y1=fir.y-st.y;
    double x2=sec.x-st.x,y2=sec.y-st.y;
    return x1*y2-x2*y1;
}

point xl(const point& a,const point& b)//向量b->a
{
    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<m;i++)
//      printf("p: %d %d\n",tb[i].x,tb[i].y);
    return m;
}

int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        memset(p,0,sizeof(p));
        memset(tb,0,sizeof(tb));
        for(int i=1; i<=n; i++)
            scanf("%lld%lld",&p[i].x,&p[i].y);
        int m=tubao(n);
        tb[m]=tb[0];
        int x=2;
        ll ans=0;
        for(int i=0; i<=m-1; i++)
        {
            while(cross(tb[x],tb[i],tb[(i+1)%m])<
                  cross(tb[(x+1)%m],tb[i],tb[(i+1)%m]))
                x=(x+1)%m;
            ans=max(ans,(tb[x].x-tb[i].x)*(tb[x].x-tb[i].x)
                    +(tb[x].y-tb[i].y)*(tb[x].y-tb[i].y));
            ans=max(ans,(tb[x].x-tb[(i+1)%m].x)*(tb[x].x-tb[(i+1)%m].x)
                    +(tb[x].y-tb[(i+1)%m].y)*(tb[x].y-tb[(i+1)%m].y));
        }
        printf("%lld\n",ans);
    }
    return 0;
}

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

旋转卡壳:

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.y<b.y;
    return a.x<b.x;
}

double cross(const point& st,const point& fir,const point& sec)
{
    double x1=fir.x-st.x,y1=fir.y-st.y;
    double x2=sec.x-st.x,y2=sec.y-st.y;
    return x1*y2-x2*y1;
}

point xl(const point& a,const point& b)//向量b->a
{
    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<m;i++)
    //    printf("p: %lld %lld\n",tb[i].x,tb[i].y);
    return m;
}

int main()
{
    int n;
    while(~scanf("%d",&n) && ~n)
    {
        memset(p,0,sizeof(p));
        memset(tb,0,sizeof(tb));
        for(int i=1; i<=n; i++)
            scanf("%lld%lld",&p[i].x,&p[i].y);
        int m=tubao(n);
        tb[m]=tb[0];
        double ans=0;
        int fir=1,sec=2;
        for(int i=0; i<=m-1; i++)
        {
            while(1)
            {
                while(cross(tb[i],tb[fir],tb[sec])<cross(tb[i],tb[fir],tb[(sec+1)%m]))
                    sec=(sec+1)%m;
                while(cross(tb[i],tb[fir],tb[sec])<cross(tb[i],tb[(fir+1)%m],tb[sec]))
                    fir=(fir+1)%m;
                if((cross(tb[i],tb[fir],tb[sec])>=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;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,311评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,339评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,671评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,252评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,253评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,031评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,340评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,973评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,466评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,937评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,039评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,701评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,254评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,259评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,497评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,786评论 2 345

推荐阅读更多精彩内容