Poj 2187 旋转卡壳求解

传送门
旋转卡壳,是利用凸包性质来求解凸包最长点对的线性算法,我们逐渐改变每一次方向,然后枚举出这个方向上的踵点对(最远点对),类似于用游标卡尺卡着凸包旋转一周,答案就在这其中的某个方向上。

直接暴力和旋转卡壳速度对比(仅此题)

#include <queue>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define ll long long
#define inf 1000000000LL
#define mod 1000000007
using namespace std;
int read()
{int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
const int N = 5e4+10;
const double PI = acos(-1.0);
const double eps = 1e-12;int dcmp(double x) {if(fabs(x)<eps) return 0; else return x<0? -1:1;
}struct Pt {double x,y;Pt(double x=0,double y=0) :x(x),y(y) {};
};
typedef Pt vec;vec operator - (Pt a,Pt b) { return vec(a.x-b.x,a.y-b.y); }
vec operator + (vec a,vec b) { return vec(a.x+b.x,a.y+b.y); }
bool operator == (Pt a,Pt b) {return dcmp(a.x-b.x)==0 && dcmp(a.y-b.y)==0;
}
bool operator < (const Pt& a,const Pt& b) {return a.x<b.x || (a.x==b.x && a.y<b.y);
}vec rotate(vec a,double x) {return vec(a.x*cos(x)-a.y*sin(x),a.x*sin(x)+a.y*cos(x));
}
double cross(vec a,vec b) { return a.x*b.y-a.y*b.x; }
double dist(Pt a,Pt b) {//return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));return ((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}vector<Pt> ConvexHull(vector<Pt> p) {sort(p.begin(),p.end());p.erase(unique(p.begin(),p.end()),p.end());int n=p.size() , m=0;vector<Pt> ch(n+1);for(int i=0;i<n;i++) {while(m>1 && cross(ch[m-1]-ch[m-2],p[i]-ch[m-2])<=0) m--;ch[m++]=p[i];}int k=m;for(int i=n-2;i>=0;i--) {while(m>k && cross(ch[m-1]-ch[m-2],p[i]-ch[m-2])<=0) m--;ch[m++]=p[i];}if(n>1) m--;ch.resize(m); return ch;
}
vector<Pt>q,con;
double RC(){con=ConvexHull(q);int n=con.size();if(n==2){         //处理特殊情况return dist(con[0],con[1]);}int i=0,j=0;for(int k=0;k<n;k++){if(!(con[i]<con[k])) i=k;if(con[j]<con[k]) j=k;}double res=0;int si=i,sj=j;while(i!=sj||j!=si){res=max(res,dist(con[i],con[j]));if(cross(con[(i+1)%n]-con[i],con[(j+1)%n]-con[j])<0){i=(i+1)%n;}else{j=(j+1)%n;}}return res;
}
int main(){int n=read();int x,y;for(int i=0;i<n;i++){x=read();y=read();q.push_back(Pt((double)x,(double)y));}printf("%.0f\n",RC());return 0;
}

转载于:https://www.cnblogs.com/zsyacm666666/p/6798133.html

Poj 2187 旋转卡壳相关推荐

  1. Bridge Across Islands POJ - 3608 旋转卡壳求凸包最近距离

    \(\color{#0066ff}{题目描述}\) 几千年前,有一个小王国位于太平洋的中部.王国的领土由两个分离的岛屿组成.由于洋流的冲击,两个岛屿的形状都变成了凸多边形.王国的国王想建立一座桥来连接 ...

  2. poj 2079(旋转卡壳)

    题意:求出平面内的点集所组成的面积最大的三角形. 解题思路:考虑凸包+旋转卡壳.面积最大的三角形的三点必定在凸包的顶点上,只不过这里要注意,三角形的边不一定就是凸包的边,有可能三角形相邻两点是横跨凸包 ...

  3. POJ 3608 旋转卡壳

    思路: 旋转卡壳应用 注意点&边  边&边  点&点 三种情况 //By SiriusRen #include <cmath> #include <cstdi ...

  4. poj 3608 旋转卡壳求不相交凸包最近距离;

    题目链接:http://poj.org/problem?id=3608 #include<cstdio> #include<cstring> #include<cmath ...

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

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

  6. poj 2187(旋转卡壳)

    传送门 模板题,求凸包,用旋转卡壳求出最远点对. 因为把int弄成double,WA了好几次,差点对idy大神给的模板失去信心...不过事实证明idy的写法没问题,orz! #include<c ...

  7. POJ 2187 凸包+旋转卡壳

    思路: 求个凸包 旋转卡壳一下 就求出来最远点对了 注意共线情况 也就是说   凸包如果有一堆点共线保留端点即可 //By SiriusRen #include <cmath> #incl ...

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

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

  9. poj 2187 凸包or旋转qia壳法

    题意: 给n(50000)个点,求这些点与点之间距离最大的距离. 解析: 先求凸包然后暴力. 或者旋转卡壳大法. 代码: #include <iostream> #include < ...

  10. POJ - 2187 Beauty Contest(最远点对)

    http://poj.org/problem?id=2187 题意 给n个坐标,求最远点对的距离平方值. 分析 模板题,旋转卡壳求求两点间距离平方的最大值. #include<iostream& ...

最新文章

  1. 【Groovy】闭包 Closure ( 闭包调用 | 闭包默认参数 it | 代码示例 )
  2. Eclipse——UML类图插件
  3. CentOS-6.0下安装配置Cacti
  4. SOFAStack的前世今生
  5. (转)暴涨、闪崩、分叉,监管,现在是投资机会?
  6. 大数据爬虫前奏之Html和Css学习
  7. 转:Visio 2010 产品秘钥 亲测可用的
  8. H264 encode and decode
  9. 尚硅谷Java Spring注解驱动开发视频教程
  10. zyf的童年(异或运算的运用)
  11. Linux---积累----处理文本技巧---去重
  12. (精华)2020年10月7日 高并发高可用 Redis实现异步架构
  13. 基于FFMPEG采集摄像头图像编码MP4视频+时间水印
  14. kivy android wifi,Kivy / Buildozer VM Ubuntu不能连接到网络的问题解决
  15. 博弈论_奇偶性、单向行走
  16. js将图片/文件等资源保存(下载)到本地
  17. 那么问题来了? int(a/b) 和 a//b 的区别在哪里呢? 例1:
  18. 15天基础爬虫、selenium、scrapy使用,附全程实现代码
  19. linux --- 2.常用命令 , python3, django安装
  20. 抓取淘宝天猫商品详情图

热门文章

  1. Atitit 图像处理 opencv使用蒙版mask抠图 切割 attilax总结
  2. Atitit.项目修改补丁打包工具 使用说明
  3. Atiti. Php Laravel 5.1 环境搭建以及  error 排除
  4. Atitit.软件开发的几大规则,法则,与原则。。。attilax总结
  5. paip.提升用户体验---c++ qt自定义窗体(2)---边框线的绘制
  6. Rust:阴阳谜题输出
  7. (转)研究报告:区块链+供应链金融
  8. 【基础教程】信噪比+香农公式【1748期】
  9. 【车间调度】基于matlab NSGA-2算法求解多目标车间调度问题【含Matlab源码 071期】
  10. tesseract box_使用Qt Box Editor在自定义数据集上训练Tesseract