计算几何-RC-poj2187
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的更多相关文章
- 【poj2187】 Beauty Contest
http://poj.org/problem?id=2187 (题目链接) 题意 求点集上两点间最长距离 Solution 凸包+旋转卡壳. 旋转卡壳是看起来很难,但是很好意会也很好实现的算法,但是要 ...
- POJ - 2031 Building a Space Station(计算几何+最小生成树)
http://poj.org/problem?id=2031 题意 给出三维坐标系下的n个球体,求把它们联通的最小代价. 分析 最小生成树加上一点计算几何.建图,若两球体原本有接触,则边权为0:否则边 ...
- [POJ2187][BZOJ1069]旋转卡壳
旋转卡壳 到现在依然不确定要怎么读... 以最远点对问题为例,枚举凸包上的两个点是最简单的想法,时间复杂度O(n2) 我们想象用两条平行线卡着这个凸包,当其中一个向某个方向旋转的时候另一个显然也是朝同 ...
- 深入研究Visual studio 2017 RC新特性
在[Xamarin+Prism开发详解三:Visual studio 2017 RC初体验]中分享了Visual studio 2017RC的大致情况,同时也发现大家对新的Visual Studio很 ...
- Xamarin+Prism开发详解三:Visual studio 2017 RC初体验
Visual studio 2017 RC出来一段时间了,最近有时间就想安装试试,随带分享一下安装使用体验. 1,卸载visual studio 2015 虽然可以同时安装visual studio ...
- Create an offline installation of Visual Studio 2017 RC
Create an offline installation of Visual Studio 2017 RC 2016年12月7日 ...
- Android中的 init.rc文件简介
init.rc脚本是由Android中linux的第一个用户级进程init进行解析的. init.rc 文件并不是普通的配置文件,而是由一种被称为"Android初始化语言"(An ...
- TypeScript 2.0候选版(RC)已出,哪些新特性值得我们关注?
注:本文提及到的代码示例下载地址 - Runnable sample to introduce Typescript 2.0 RC new features 作为一个Javascript的超集, Ty ...
- vs2017 rc 离线安装包制作
vs2017 rc 离线安装包制作 1.下载在线安装包:https://aka.ms/vs/15/release/vs_Enterprise.exe 2.制作离线安装包: vs_Enterprise. ...
- ACM/ICPC 之 计算几何入门-叉积-to left test(POJ2318-POJ2398)
POJ2318 本题需要运用to left test不断判断点处于哪个分区,并统计分区的点个数(保证点不在边界和界外),用来做叉积入门题很合适 //计算几何-叉积入门题 //Time:157Ms Me ...
随机推荐
- 前端:将网站打造成单页面应用SPA
前端:将网站打造成单页面应用SPA 前言 不知你有没有发现,像Github.百度.微博等这些大站,已经不再使用普通的a标签做跳转了.他们大多使用Ajax请求替代了a标签的默认跳转,然后使用HTML ...
- LaTeX技巧007:每一章开始的header引用名言应该怎么做?
[问题描述] 看到很多论文的每一章开始的右上角都有一段名人名言, 我试验了很多次一直都搞不清楚是怎么搞?是用fancyhead么?谁可以说说呢? 多谢了 [解决方案] 使用epigraph宏包来制作即 ...
- 机器学习作业(二)逻辑回归——Matlab实现
题目太长啦!文档下载[传送门] 第1题 简述:实现逻辑回归. 第1步:加载数据文件: data = load('ex2data1.txt'); X = data(:, [1, 2]); y = dat ...
- AntDesign(React)学习-11 使用mobx
mobx 是由 Mendix.Coinbase.Facebook 开源和众多个人赞助商所赞助的. mobx和redux类似,也可以用来进行状态管理,并且更简单,更灵活.初次研究,先实现一个最简单的功能 ...
- 简单的Spring1.0小配置
开始Spring AOP的小理解 拿一个小例子来说吧! 老师上课 这样的例子! 老师上课--就是一个核心的业务! 那么上课之前需要点名,天气太热,需要开空调! 这个时候,一个老 ...
- 洛谷P1093 奖学金
https://www.luogu.org/problem/P1093 #include <bits/stdc++.h> using namespace std; struct Node{ ...
- 在GPU上训练数据
在GPU上训练数据 模型搬到GPU上 数据搬到GPU上 损失函数计算搬到GPU上
- c#中的强类型、弱类型和泛型
强类型和弱类型的变量都有两个属性:类型和值. 强类型的变量类型是不能改变的,弱类型的变量类型是随需改变的,这是强弱的真正含义. 我们在编写c#代码时,变量类型是明确的,不可更改的,如string就是s ...
- jQuery - 下拉框
jQuery - option的值 获取值 $("#equip_show").change(function(){ //获取文本 var checkText = $("# ...
- TD-在http请求头上添加参数
dojo.xhrGet({ url : url, timeout : easy7.timeout, headers: { iBaseToken: easy7.iBaseToken },