当前位置: 首页 > news >正文

POJ2187 旋转卡壳 求最长直径

给定平面上的一些散点集,求最远两点距离的平方值。

 

题解:

旋转卡壳求出凸包,然后根据单调性,求出最远两点的最大距离

 

 1 #pragma GCC optimize(2)
 2 #pragma G++ optimize(2)
 3 #include<cstring>
 4 #include<cmath>
 5 #include<iostream>
 6 #include<algorithm>
 7 #include<cstdio>
 8 
 9 #define eps 0.00000001
10 #define N 50007
11 using namespace std;
12 inline int read()
13 {
14     int x=0,f=1;char ch=getchar();
15     while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
16     while(isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
17     return x*f;
18 }
19 
20 int n,top;
21 double ans;
22 
23 double sqr(double x){return x*x;}
24 struct P
25 {
26     double x,y;
27     P(){}
28     P(double _x,double _y):x(_x),y(_y){}
29     friend P operator+(P a,P b){return P(a.x+b.x,a.y+b.y);}
30     friend P operator-(P a,P b){return P(a.x-b.x,a.y-b.y);}
31     friend double operator*(P a,P b){return a.x*b.y-a.y*b.x;}
32     friend double operator/(P a,P b){return a.x*b.x+a.y*b.y;}
33     friend bool operator==(P a,P b){return fabs(a.x-b.x)<eps&&fabs(a.y-b.y)<eps;}
34     friend bool operator!=(P a,P b){return !(a==b);}
35     friend bool operator<(P a,P b)
36     {
37         if(fabs(a.y-b.y)<eps)return a.x<b.x;
38         return a.y<b.y;
39     }
40     friend double dis2(P a){return sqr(a.x)+sqr(a.y);}
41     friend void print(P a){printf("%.2lf %.2lf\n",a.x,a.y);}
42 }p[N],q[N];
43 
44 bool cmp(P a,P b)
45 {
46     if(fabs((b-p[1])*(a-p[1]))<eps)return dis2(a-p[1])<dis2(b-p[1]);
47     return (a-p[1])*(b-p[1])>0;//叉乘大于0,表示向左转,a的斜率更小。
48 }
49 void Graham()//选出凸包上的点。
50 {
51     for (int i=1;i<=n;i++)
52         if(p[i]<p[1])swap(p[i],p[1]);
53     sort(p+2,p+n+1,cmp);
54     q[++top]=p[1],q[++top]=p[2];
55     for (int i=3;i<=n;i++)
56     {
57         while((q[top]-q[top-1])*(p[i]-q[top-1])<eps&&top>1)top--;//如果当前的点的斜率更小,就替换
58         q[++top]=p[i];
59     }
60 }
61 void RC()//求直径。
62 {
63     q[top+1]=q[1];//因为凸包是一个圈。
64     int now=2;
65     for (int i=1;i<=top;i++)
66     {
67         while((q[i+1]-q[i])*(q[now]-q[i])<(q[i+1]-q[i])*(q[now+1]-q[i]))
68         {
69             now++;
70             if(now==top+1)now=1;
71         }
72         ans=max(ans,dis2(q[now]-q[i]));
73     }
74 }
75 int main()
76 {
77     n=read();
78     for (int i=1;i<=n;i++)
79         p[i].x=read(),p[i].y=read();
80     Graham();
81     RC();
82     printf("%d",(int)ans);
83 }

 

转载于:https://www.cnblogs.com/fengzhiyuan/p/8531010.html

相关文章:

  • 《Java并发编程的艺术》--Java中的锁
  • win10 vs2015源码编译tesseract4.0
  • Go语言备忘录(2):反射的原理与使用详解
  • ubuntu16.04 更换源
  • Django中间件middleware
  • 结构图
  • libimobiledevice --Mingw32交叉编译
  • 在c:forEach作用域外使用标签所产生的值
  • 04-手机套餐:建造者模式
  • css总结1:position定位:absolute/relative/fixed
  • zzw原创_非root用户启动apache的问题解决(非root用户启动apache的1024以下端口)
  • SQL循环语句 详解
  • OpenCV问题集锦
  • 20154327 Exp1 PC平台逆向破解
  • ios 通知与通知传值2018.03.17
  • 【EOS】Cleos基础
  • HTTP 简介
  • MySQL-事务管理(基础)
  • PHP 7 修改了什么呢 -- 2
  • Sublime text 3 3103 注册码
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • Vue--数据传输
  • vue学习系列(二)vue-cli
  • Wamp集成环境 添加PHP的新版本
  • win10下安装mysql5.7
  • 电商搜索引擎的架构设计和性能优化
  • 那些被忽略的 JavaScript 数组方法细节
  • 前端性能优化--懒加载和预加载
  • 前端之React实战:创建跨平台的项目架构
  • 让你的分享飞起来——极光推出社会化分享组件
  • 探索 JS 中的模块化
  • 译米田引理
  • 正则与JS中的正则
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • C# - 为值类型重定义相等性
  • 浅谈sql中的in与not in,exists与not exists的区别
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • # 飞书APP集成平台-数字化落地
  • (pytorch进阶之路)扩散概率模型
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (二)windows配置JDK环境
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (附源码)计算机毕业设计ssm电影分享网站
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (十八)三元表达式和列表解析
  • (转)大道至简,职场上做人做事做管理
  • (转)负载均衡,回话保持,cookie
  • (轉)JSON.stringify 语法实例讲解
  • .dwp和.webpart的区别
  • .htaccess配置常用技巧
  • .NET Core中Emit的使用
  • .net 验证控件和javaScript的冲突问题
  • .NET/C# 编译期能确定的字符串会在字符串暂存池中不会被 GC 垃圾回收掉