This article is made by Jason-Cow.
Welcome to reprint.
But please post the article's address.

今天学习一下旋(xuan1)转(zhuan3)卡(qia3)壳(qiao4)

1.凸包

2.对踵点

定理:最远点对必然属于对踵点对集合

对踵点定义:

        如果过凸包上的两个点可以画一对平行直线,使凸包上的所有点都

夹在两条平行线之间或落在平行线上,那么这两个点叫做一对对踵点。

具体有两种情况:

1.两个平行线正好卡着两个点

2.两个平行线分别卡着一条边和一个点

Rotating calipers Algorithm 是基于情况2的

        考虑到,固定一条边,凸包上的点到线的距离构成一个单峰函数,

所以,有“单调性”(姑且叫做单调性)

直观的感受一下

 

 

post the Rujia Liu 's words :

/*
当Area(p[u], p[u+1], p[v+1]) <= Area(p[u], p[u+1], p[v])时停止旋转
即Cross(p[u+1]-p[u], p[v+1]-p[u]) - Cross(p[u+1]-p[u], p[v]-p[u]) <= 0
根据Cross(A,B) - Cross(A,C) = Cross(A,B-C)
化简得Cross(p[u+1]-p[u], p[v+1]-p[v]) <= 0
*/

旋转code

 db RC(D*R,int n){//Rotating calipers
R[]=R[n];// avoid to mod
db ans=0.0;
for(int u=,v=;u<n;u++){
while(Cross(R[u+]-R[u],R[v+]-R[v])>)v=(v+)%n;
ans=max(ans,Dis2(R[u],R[v]));
ans=max(ans,Dis2(R[u+],R[v+]));
}
return ans;
}

RC

一个小技巧,手写unique(其实是不会用STL,PS:不去重可以过)

 bl operator==(D A,D B){return (fabs(A.x-B.x)<eps && fabs(A.y-B.y)<eps);}

 void Unique(D*R,int&n){
bl*In=new bl[n];
for(int i=;i<=n;i++)if(R[i+]==R[i])In[i+]=;else In[i]=;
int cnt=;
for(int i=;i<=n;i++)if(!In[i])R[++cnt]=R[i];
n=cnt;
}

Unique

ACcode

 #include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <cmath>
#include <queue>
#include <map>
#include <set>
using namespace std;
#define sqr(x) ((x)*(x))
#define RG register
#define op operator
#define IL inline
typedef double db;
typedef bool bl;
const db pi=acos(-1.0),eps=1e-;
struct D{
db x,y;
D(db x=0.0,db y=0.0):x(x),y(y){}
};
typedef D V;
bl operator<(D A,D B){return A.x<B.x||(A.x==B.x&&A.y<B.y);}
bl operator==(D A,D B){return (fabs(A.x-B.x)<eps && fabs(A.y-B.y)<eps);}
V operator+(V A,V B){return V(A.x+B.x,A.y+B.y);}
V operator-(V A,V B){return V(A.x-B.x,A.y-B.y);}
V operator*(V A,db N){return V(A.x*N,A.y*N);}
V operator/(V A,db N){return V(A.x/N,A.y/N);} db Ang(db x){return(x*180.0/pi);}
db Rad(db x){return(x*pi/180.0);}
V Rotate(V A,db a){return V(A.x*cos(a)-A.y*sin(a),A.x*sin(a)+A.y*cos(a));}
db Dis2(D A,D B){return sqr(A.x-B.x)+sqr(A.y-B.y);}
db Dis(D A,D B){return sqrt(sqr(A.x-B.x)+sqr(A.y-B.y));}
db Cross(V A,V B){return A.x*B.y-A.y*B.x;}
db Dot(V A,V B){return A.x*B.x+A.y*B.y;} void Unique(D*R,int&n){
bl*In=new bl[n];
for(int i=;i<=n;i++)if(R[i+]==R[i])In[i+]=;else In[i]=;
int cnt=;
for(int i=;i<=n;i++)if(!In[i])R[++cnt]=R[i];
n=cnt;
} int Andrew(D*R,int&n,D*A){
int m=;
sort(R+,R+n+);
Unique(R,n);
for(int i=;i<=n;i++){
while(m>= && Cross(A[m]-A[m-],R[i]-A[m-])<=)m--;
A[++m]=R[i];
}
int k=m;
for(int i=n-;i>=;i--){
while(m>k && Cross(A[m]-A[m-],R[i]-A[m-])<=)m--;
A[++m]=R[i];
}
return n>?m-:m;
} db RC(D*R,int n){ //Rotating calipers
R[]=R[n]; // avoid to mod
db ans=0.0;
for(int u=,v=;u<n;u++){
while(Cross(R[u+]-R[u],R[v+]-R[v])>)v=(v+)%n;
ans=max(ans,Dis2(R[u],R[v]));
ans=max(ans,Dis2(R[u+],R[v+]));
}
return ans;
} const int MAXN=(int)4e5+;
D R[MAXN],T[MAXN]; int main(){
int n;scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%lf%lf",&R[i].x,&R[i].y);
int m=Andrew(R,n,T);
printf("%.0lf\n",RC(T,m));
return ;
}

计算几何-RC-poj2187的更多相关文章

  1. 【poj2187】 Beauty Contest

    http://poj.org/problem?id=2187 (题目链接) 题意 求点集上两点间最长距离 Solution 凸包+旋转卡壳. 旋转卡壳是看起来很难,但是很好意会也很好实现的算法,但是要 ...

  2. POJ - 2031 Building a Space Station(计算几何+最小生成树)

    http://poj.org/problem?id=2031 题意 给出三维坐标系下的n个球体,求把它们联通的最小代价. 分析 最小生成树加上一点计算几何.建图,若两球体原本有接触,则边权为0:否则边 ...

  3. [POJ2187][BZOJ1069]旋转卡壳

    旋转卡壳 到现在依然不确定要怎么读... 以最远点对问题为例,枚举凸包上的两个点是最简单的想法,时间复杂度O(n2) 我们想象用两条平行线卡着这个凸包,当其中一个向某个方向旋转的时候另一个显然也是朝同 ...

  4. 深入研究Visual studio 2017 RC新特性

    在[Xamarin+Prism开发详解三:Visual studio 2017 RC初体验]中分享了Visual studio 2017RC的大致情况,同时也发现大家对新的Visual Studio很 ...

  5. Xamarin+Prism开发详解三:Visual studio 2017 RC初体验

    Visual studio 2017 RC出来一段时间了,最近有时间就想安装试试,随带分享一下安装使用体验. 1,卸载visual studio 2015 虽然可以同时安装visual studio ...

  6. Create an offline installation of Visual Studio 2017 RC

    Create an offline installation of Visual Studio 2017 RC ‎2016‎年‎12‎月‎7‎日                             ...

  7. Android中的 init.rc文件简介

    init.rc脚本是由Android中linux的第一个用户级进程init进行解析的. init.rc 文件并不是普通的配置文件,而是由一种被称为"Android初始化语言"(An ...

  8. TypeScript 2.0候选版(RC)已出,哪些新特性值得我们关注?

    注:本文提及到的代码示例下载地址 - Runnable sample to introduce Typescript 2.0 RC new features 作为一个Javascript的超集, Ty ...

  9. vs2017 rc 离线安装包制作

    vs2017 rc 离线安装包制作 1.下载在线安装包:https://aka.ms/vs/15/release/vs_Enterprise.exe 2.制作离线安装包: vs_Enterprise. ...

  10. ACM/ICPC 之 计算几何入门-叉积-to left test(POJ2318-POJ2398)

    POJ2318 本题需要运用to left test不断判断点处于哪个分区,并统计分区的点个数(保证点不在边界和界外),用来做叉积入门题很合适 //计算几何-叉积入门题 //Time:157Ms Me ...

随机推荐

  1. Qt 程序打包发布总结 转

    1.  概述 当我们用QT写好了一个软件,要把你的程序分享出去的时候,不可能把编译的目录拷贝给别人去运行.编译好的程序应该是一个主程序,加一些资源文件,再加一些动态链接库,高大上一些的还可以做一个安装 ...

  2. Luogu4316 | 绿豆蛙的归宿 (期望DP)

    题目背景 随着新版百度空间的上线,Blog宠物绿豆蛙完成了它的使命,去寻找它新的归宿. 题目描述 给出一个有向无环图,起点为1终点为N,每条边都有一个长度,并且从起点出发能够到达所有的点,所有的点也都 ...

  3. [hive]case 语句中字符串匹配

    当使用case when时,有时会需要对某个字段做子串匹配.如果是在where条件中,我们会直接使用 like '%xx%'来匹配,但case when语句不行 这时需要使用instr函数 examp ...

  4. APP和web设计区别

    1.web在给定了核心功能后,还可以往页面再添加小需求如banner.快捷工具条.分页等. APP界面设计时,则偏向精简,尽可能明显的展示核心功能. 2.APP中需要考虑ISO和Andriod两种交互 ...

  5. IOU 选框和真实框重叠部分占两个总框并集的比例

    IOU 选框和真实框重叠部分占两个总框并集的比例 IOU 召回率:表示在预测为的正类中,有多少正类被预测为正类 https://blog.csdn.net/qq_36653505/article/de ...

  6. docker-储存持久化

    docker容器不适合存放数据,重要的数据要用外部卷存储,容器可以挂载真实机目录或者共享存储为卷 储存卷映射 docker run -itd -v 真实机目录:容器目录 镜像:标签 可以做一台nfs服 ...

  7. 转载:dsp芯片的定点运算

    转自: http://ishare.iask.sina.com.cn/f/37179153.html

  8. Eclipse设置代码模板

    个人博客 地址:http://www.wenhaofan.com/article/20180904173808 根据下列路径打开配置窗口 Window->Preferences->Java ...

  9. PyQt5+Eric6开发的一个使用菜单栏、工具栏和状态栏的示例

    前言 在做一个数据分析的桌面端程序遇到一些问题,这里简单整理下,分享出来供使用者参考. 1.网上查使用PyQt5工具栏的示例,发现很多只是一个简单的退出功能,如果有几个按钮如何处理?如何区分点击的究竟 ...

  10. [USACO16OPEN]248&262144

    Description 在1*n的序列中,每次可以合并两个相邻且相等的数,变成它们两个加1,求最大的数. Solution 设\(f[i][j]\)表示\([i,k)\)这个区间能合并出\(j\)的最 ...