BZOJ 1069 求凸包+旋转卡壳

思路:
求凸包:
先按照x轴排个序
从左往右扫一遍 找到上凸壳 (用叉积)
再从右往左扫一遍 求下凸壳

搞个旋转卡壳就好啦~

嗯 我手懒
用的C++ Complex库
巨好用!

//By SiriusRen
#include <cstdio>
#include <complex>
#include <algorithm>
using namespace std;
#define Cplexd complex<double>
int n,q[4444];
double xx,yy;
Cplexd ff[2222];
bool cmp(Cplexd a,Cplexd b){return a.real()<b.real();}
double cj(int x,int y,int z){
    Cplexd tmp=ff[z]-ff[y];tmp.imag()=-tmp.imag();
    return (tmp*(ff[x]-ff[y])).imag();
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%lf%lf",&xx,&yy);
        ff[i].real()=xx,ff[i].imag()=yy;
    }
    sort(ff+1,ff+1+n,cmp);
    q[1]=1,q[2]=2;int ta=2;
    for(int i=3;i<=n;q[++ta]=i,i++)
        while(ta>=2&&cj(q[ta],q[ta-1],i)>=0)ta--;
    int ta2=ta;
    for(int i=n-1;i;q[++ta]=i,i--)
        while(ta>=ta2+1&&cj(q[ta],q[ta-1],i)>=0)ta--;
    double ans=0.0;
    for(int i=1,l=2,r=4;i<ta;l=i+1,r=i+3,i++)
        for(int j=i+2;j<ta-1;j++){
            while(l<j-1&&cj(q[j],q[i],q[l])<=cj(q[j],q[i],q[l+1]))l++;
            while(r<=j||(r<ta-1&&cj(q[r],q[i],q[j])<=cj(q[r+1],q[i],q[j])))r++;
            ans=max(ans,cj(q[j],q[i],q[l])+cj(q[r],q[i],q[j]));
        }
    printf("%.3f",ans/2);
}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值