original link - http://poj.org/problem?id=2187

题意:

求最远点对

推荐 https://blog.csdn.net/wang_heng199/article/details/74477738

解析:

对踵点定义:多边形的两个位于平行切线上的点。

我们可以通过旋转卡壳O(n)O(n)O(n)得出所有点对应的对踵点。(先处理凸包)


旋转卡壳

当我们顺时针枚举点的时候,这些点的对踵点应该也是顺时针的,所以我们以此枚举即可。

显然对踵点到这条边的距离最长,也就是说形成的三角形面积最大,所以我们可以用叉积来判断对踵点。

代码:

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
#include<time.h>
using namespace std;
const int maxn=5e4+9;
const double eps=1e-7;
struct point{double x,y;point(double x=0,double y=0):x(x),y(y){}
};
typedef point P;
typedef point Point;
typedef point Vector;
Vector operator + (Vector a, Vector b){//向量加法return Vector(a.x + b.x, a.y + b.y);
}
Vector operator - (Vector a, Vector b){//向量减法return Vector(a.x - b.x, a.y - b.y);
}
Vector operator * (Vector a, double p){//向量数乘return Vector(a.x*p, a.y*p);
}
Vector operator / (Vector a, double p){//向量数除return Vector(a.x / p, a.y / p);
}
int dcmp(double x){//精度三态函数(>0,<0,=0)if (fabs(x) < eps)return 0;else if (x > 0)return 1;return -1;
}
bool operator == (const Point &a, const Point &b){//向量相等return dcmp(a.x - b.x) == 0 && dcmp(a.y - b.y) == 0;
}
double Cross(P a,P b){ // 叉积 平行四边形面积return (a.x*b.y)-(b.x*a.y);
}
double LengthPow(Vector v){return v.x*v.x+v.y*v.y;
}
double Distance(P a,P b){return sqrt(LengthPow(a-b));
}point p[maxn],ans[maxn];
int n,top;
point Tmp;//选好的起点
bool cmp(point a,point b){double ans=Cross(a-Tmp,b-Tmp);if(dcmp(ans)==0)return dcmp(Distance(a,Tmp)-Distance(b,Tmp))<0;return ans>0;//表示a到b是逆时针转
}
// 去掉共线点
void Graham(point p[],int n,point ans[],int &top){if(n<3){for(int i=1;i<=n;i++)ans[i]=p[i];top=n;return;}for(int i=2;i<=n;i++){if(p[i].y<p[1].y||(dcmp(p[i].y-p[1].y)==0&&p[i].x<p[1].x))swap(p[1],p[i]);}Tmp=p[1];sort(p+2,p+1+n,cmp);ans[1]=p[1],ans[2]=p[2],top=2;for(int i=3;i<=n;i++){while(top>2&&dcmp(Cross(ans[top]-ans[top-1],p[i]-ans[top]))<=0)top--;ans[++top]=p[i];if(top>2&&dcmp(Cross(ans[top]-ans[top-1],ans[top-1]-ans[top-2]))==0)ans[top-1]=ans[top],--top;}
}#define rep(i,a,b) for(int i=a;i<=b;i++)double RotateCalipers(P *p,int n){if(n==2)return LengthPow(p[1]-p[2]);double ans=-1;p[n+1]=p[1];// 保证q在i的前面,使得∠q_i+1_i小于180度int q=2;rep(i,1,n){// 枚举边i~i+1 , 如果q+1优于q , 旋转while(Cross(p[q]-p[i+1],p[i]-p[i+1])<Cross(p[q+1]-p[i+1],p[i]-p[i+1]))q=q%n+1;ans=max(ans,max(LengthPow(p[q]-p[i]),LengthPow(p[q+1]-p[i+1])));}return ans;
}int main(){int n;while(scanf("%d",&n)!=EOF){rep(i,1,n){scanf("%lf%lf",&p[i].x,&p[i].y);}Graham(p,n,ans,top);printf("%.0f\n",round(RotateCalipers(ans,top)));}
}

最远对踵点 旋转卡壳相关推荐

  1. POJ - 2187 Beauty Contest (求距离最远点对-凸包+旋转卡壳/枚举 (旋转卡壳学习))

    链接:https://vjudge.net/problem/POJ-2187 题意:求求距离最远点对. 思路:肯定为凸包上的点,可枚举,也可根据凸包性质旋转卡壳求对踵点. 参考博客: https:// ...

  2. 轮廓中对踵点/旋转卡壳

    最近遇到需要求图形轮廓中距离最远的点,即长轴. 网上查了一些资料,思路如下. 1. 利用OpenCV提取图形的轮廓点. 2. 把提取到的所有轮廓点当做一个集合,再次提取最外面的轮廓. 3. 用凸包旋转 ...

  3. 旋转卡壳凸包(不用一下子就学完所有)

    目录 前言 参考博客 前置知识 1.极角排序 2.凸包(默认逆时针) 3.对踵点 旋转卡壳能解决的各类问题 1.计算距离 1.1凸多边形直径 1.2凸多边形宽 1.3凸多边形间最大距离 1.4凸多边形 ...

  4. POJ2187-最远点对-旋转卡壳(怎么开心怎么读)

    给n个点,求最远点对,n<=50000 n^2暴力可以过么- -||   给了3s 不过据说凸包+n^2暴力可以过,没有卡数据. 然后我写了一下,发现果然数据很弱. 这是裸的凸包+n^2 #in ...

  5. [POJ2187]Beauty Contest(计算几何-旋转卡壳-最远点对)

    题目: 我是超链接 题解: 值得一提的是,这是一个"不定向"算法,为什么呢,因为ta的名字不定哈哈哈,旋转卡壳一共有2*3*2*2=24种不同的读音哦 旋转卡壳可以解决:凸多边形最 ...

  6. poj 2187 Beauty Contest (凸包: 最远点对,最长直径 , 旋转卡壳法)

    http://poj.org/problem?id=2187 题意: 最长的点对近距离的平方: 题解: 旋转卡壳法, 要注意的地方是,有 所有点共线的情况,所以,(求凸包时)要将,共线点去出 :    ...

  7. 算法学习:计算几何旋转卡壳

    [定义] [对踵点]多边形上存在平行切线的两点 [多边形半径]多边形上任意两点的最大长度 [旋转卡壳] 选取y轴上,最高和最低的两个点,令两条平行于x轴的线切过这两点 然后我们开始让这两条线旋转 当一 ...

  8. 【BZOJ1185】【HNOI2007】最小矩形覆盖(凸包+旋转卡壳)

    传送门 题意:求最小矩阵覆盖 有这样一个结论:矩阵一定有一条边在凸包上(不会证) 那可以枚举每条边 同时旋转卡壳 只是这时不只维护一个对踵点对,同时在左右侧再维护一个最远点 可以发现左右最远点一定是和 ...

  9. LA 4728 (旋转卡壳) Squares

    题意: 求平面上的最远点对距离的平方. 分析: 对于这个数据量枚举肯定是要超时的. 首先这两个点一定是在凸包上的,所以可以枚举凸包上的点,因为凸包上的点要比原来的点会少很多,可最坏情况下的时间复杂度也 ...

最新文章

  1. 干货丨AI语音二三事:你需要了解这些AI 语音对话技术
  2. 高温预警c语言,注意 | 高温预警来了!最高38°C!高温7连击!
  3. iOS开发-Runtime详解(简书)
  4. Zabbix+shell监控报警任意web
  5. C# 动态创建数据库三(MySQL)
  6. 论文笔记_S2D.74_2021_ICRA_PENet:面向精确和高效的图像引导的深度补全
  7. android 多线程 进度条,Android子线程进度条不显示的问题
  8. [Material Design] 打造简单朴实的CheckBox
  9. vs2010+Silverlight4+wcf开发部署全过程
  10. 如何用快解析自制IoT云平台
  11. 电脑端微信无法打开腾讯文档
  12. 【小白转型项目经理】实战案例14,总价合同如何向甲方申请其他费用补偿?
  13. sublime3注册机使用
  14. QQ秀文字,很酷的!
  15. java 同时返回两个参数,如何在java中返回两个参数
  16. 单片机软件定时器V1.0,可大批量创建,操作简单
  17. 编译器之语法分析器(syntax analyzer)
  18. 媒体该如何展示事实之美?
  19. 抖音seo优化怎么做?抖音seo流程详解
  20. 前端 HTML(1)

热门文章

  1. 使用Amazon S3下载HCP数据
  2. (十)老照片修复、图像超分、图片提高分辨率、图片高清化、图片清晰化、黑白图片上色、人脸祛斑、美颜、人体瘦身、图像去噪、人像抠图、批量处理、视频提高分辨率、视频逐帧修复
  3. esp8266学习报告
  4. apollo配置mysql_携程apollo配置中心搭建
  5. 最新条码标签软件 BarTender 2022 R1
  6. 首次揭秘,阿里P5到P10的晋升方法论
  7. 软件需求分析课堂讨论01
  8. 网络安全专用3款黑客新工具,好用得不得了 !
  9. 程序员发帖引争议!公务员香吗?哪来的优越感?
  10. 英语字谜求解程序(JAVA):iMessage-GamePigeon的“字谜”