POJ 2187 凸包&旋转卡壳

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <queue>
#include <vector>
#include <map>
#define pb push_back
#define mp make_pair
#define eps 1e-9
#define zero(x) (fabs(x)<eps)
#define pi acos(-1.0)
#define f1 first
#define f2 second
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define initial 1,n,1
const int inf=0x3f3f3f3f;
const long long INF=1LL<<50;
using namespace std;
typedef long long LL;
typedef pair <int, int> PII;
template<typename X> inline bool minimize(X&p,X q){if(p<=q)return 0;p=q;return 1;}
template<typename X> inline bool maximize(X&p,X q){if(p>=q)return 0;p=q;return 1;}
#define N 100005
double add(double a,double b)
{
    if (abs(a+b)<eps*(abs(a)+abs(b))) return 0;
    return a+b;
}
struct P{
    double x,y;
    P(){}
    P(double x,double y):x(x),y(y){}
    P operator+(P p){return P(add(x,p.x),add(y,p.y));}
    P operator-(P p){return P(add(x,-p.x),add(y,-p.y));}
    P operator*(double d){return P(x*d,y*d);}
    double dot(P p){return add(x*p.x,y*p.y);}//内积
    double det(P p){return add(x*p.y,-y*p.x);}//外积
};
P a[N];
vector<P > qq;
int n;
bool cmp(const P&p ,const P&q)
{
    if (p.x!=q.x) return p.x<q.x;
    return p.y<q.y;
}

void convex(P* st,int n,vector<P> &ps)
{   ps.resize(n*2);
    int k=0;
    sort(st,st+n,cmp);
    for (int i=0;i<n;i++)
        {   while (k>1&&(ps[k-1]-ps[k-2]).det(st[i]-ps[k-1])<=0) k--;
            
            //若想含边上的点,可以将<=改成<
            ps[k++]=st[i];
        }
    for (int i=n-2,t=k;i>=0;i--)
        {   while (k>t&&(ps[k-1]-ps[k-2]).det(st[i]-ps[k-1])<=0) k--;
            ps[k++]=st[i];
        }
    ps.resize(max(k-1,1));
}
double dist(P& p,P& q)
{
    return (p-q).dot(p-q);
}
void doit()
{   for (int i=0;i<n;i++)
        scanf("%lf%lf",&a[i].x,&a[i].y);
    convex(a,n,qq);
    int nn=qq.size();
    if (nn==1)
        {
            printf("0\n");return;
        }
    if (nn==2)
        {
            printf("%.0lf\n",dist(qq[0],qq[1]));return;
        }

    int  i=0,j=0;
    for (int k=0;k<nn;k++)
        {
            if (!cmp(qq[i],qq[k])) i=k;
            if (cmp(qq[j],qq[k])) j=k;
        }
    double res=0;
    int si=i,sj=j;
    while (i!=sj||j!=si)
         {
             res=max(res,dist(qq[i],qq[j]));
             if ((qq[(i+1)%nn]-qq[i]).det(qq[(j+1)%nn]-qq[j])<0)//逆顺正好反
             i=(i+1)%nn;
            else j=(j+1)%nn;
         }


    printf("%.0lf\n",res);

}
int main()
{   while (scanf("%d",&n)!=EOF) doit();
}

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值