最远对踵点 旋转卡壳
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)));}
}
最远对踵点 旋转卡壳相关推荐
- POJ - 2187 Beauty Contest (求距离最远点对-凸包+旋转卡壳/枚举 (旋转卡壳学习))
链接:https://vjudge.net/problem/POJ-2187 题意:求求距离最远点对. 思路:肯定为凸包上的点,可枚举,也可根据凸包性质旋转卡壳求对踵点. 参考博客: https:// ...
- 轮廓中对踵点/旋转卡壳
最近遇到需要求图形轮廓中距离最远的点,即长轴. 网上查了一些资料,思路如下. 1. 利用OpenCV提取图形的轮廓点. 2. 把提取到的所有轮廓点当做一个集合,再次提取最外面的轮廓. 3. 用凸包旋转 ...
- 旋转卡壳凸包(不用一下子就学完所有)
目录 前言 参考博客 前置知识 1.极角排序 2.凸包(默认逆时针) 3.对踵点 旋转卡壳能解决的各类问题 1.计算距离 1.1凸多边形直径 1.2凸多边形宽 1.3凸多边形间最大距离 1.4凸多边形 ...
- POJ2187-最远点对-旋转卡壳(怎么开心怎么读)
给n个点,求最远点对,n<=50000 n^2暴力可以过么- -|| 给了3s 不过据说凸包+n^2暴力可以过,没有卡数据. 然后我写了一下,发现果然数据很弱. 这是裸的凸包+n^2 #in ...
- [POJ2187]Beauty Contest(计算几何-旋转卡壳-最远点对)
题目: 我是超链接 题解: 值得一提的是,这是一个"不定向"算法,为什么呢,因为ta的名字不定哈哈哈,旋转卡壳一共有2*3*2*2=24种不同的读音哦 旋转卡壳可以解决:凸多边形最 ...
- poj 2187 Beauty Contest (凸包: 最远点对,最长直径 , 旋转卡壳法)
http://poj.org/problem?id=2187 题意: 最长的点对近距离的平方: 题解: 旋转卡壳法, 要注意的地方是,有 所有点共线的情况,所以,(求凸包时)要将,共线点去出 : ...
- 算法学习:计算几何旋转卡壳
[定义] [对踵点]多边形上存在平行切线的两点 [多边形半径]多边形上任意两点的最大长度 [旋转卡壳] 选取y轴上,最高和最低的两个点,令两条平行于x轴的线切过这两点 然后我们开始让这两条线旋转 当一 ...
- 【BZOJ1185】【HNOI2007】最小矩形覆盖(凸包+旋转卡壳)
传送门 题意:求最小矩阵覆盖 有这样一个结论:矩阵一定有一条边在凸包上(不会证) 那可以枚举每条边 同时旋转卡壳 只是这时不只维护一个对踵点对,同时在左右侧再维护一个最远点 可以发现左右最远点一定是和 ...
- LA 4728 (旋转卡壳) Squares
题意: 求平面上的最远点对距离的平方. 分析: 对于这个数据量枚举肯定是要超时的. 首先这两个点一定是在凸包上的,所以可以枚举凸包上的点,因为凸包上的点要比原来的点会少很多,可最坏情况下的时间复杂度也 ...
最新文章
- 干货丨AI语音二三事:你需要了解这些AI 语音对话技术
- 高温预警c语言,注意 | 高温预警来了!最高38°C!高温7连击!
- iOS开发-Runtime详解(简书)
- Zabbix+shell监控报警任意web
- C# 动态创建数据库三(MySQL)
- 论文笔记_S2D.74_2021_ICRA_PENet:面向精确和高效的图像引导的深度补全
- android 多线程 进度条,Android子线程进度条不显示的问题
- [Material Design] 打造简单朴实的CheckBox
- vs2010+Silverlight4+wcf开发部署全过程
- 如何用快解析自制IoT云平台
- 电脑端微信无法打开腾讯文档
- 【小白转型项目经理】实战案例14,总价合同如何向甲方申请其他费用补偿?
- sublime3注册机使用
- QQ秀文字,很酷的!
- java 同时返回两个参数,如何在java中返回两个参数
- 单片机软件定时器V1.0,可大批量创建,操作简单
- 编译器之语法分析器(syntax analyzer)
- 媒体该如何展示事实之美?
- 抖音seo优化怎么做?抖音seo流程详解
- 前端 HTML(1)
热门文章
- 使用Amazon S3下载HCP数据
- (十)老照片修复、图像超分、图片提高分辨率、图片高清化、图片清晰化、黑白图片上色、人脸祛斑、美颜、人体瘦身、图像去噪、人像抠图、批量处理、视频提高分辨率、视频逐帧修复
- esp8266学习报告
- apollo配置mysql_携程apollo配置中心搭建
- 最新条码标签软件 BarTender 2022 R1
- 首次揭秘,阿里P5到P10的晋升方法论
- 软件需求分析课堂讨论01
- 网络安全专用3款黑客新工具,好用得不得了 !
- 程序员发帖引争议!公务员香吗?哪来的优越感?
- 英语字谜求解程序(JAVA):iMessage-GamePigeon的“字谜”