题意

PDF

就是求凸包点集的直径。

题解

当然选择旋转卡壳。

然后是实现上的技巧:

当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

画个图就能发现,这样找的是对于一条边三角形的最大高。为什么这样是对的呢?

凸包上一个点到其他点的距离是一个凸函数。然后在两条直线慢慢旋转的过程中,可以考虑直接转一条边,这样求出的是到这条直线的最大距离,显然就是对踵点对。

实现的时候初始化可以直接暴力转,因为均摊是\(O(n)\)的。时间复杂度\(O(T n \log n)\)。


由于坐标都是整数,而又不涉及需要实数运算的操作,所以`Point`类可以直接实现为整数坐标。
```cpp
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define rg register
#define il inline
#define co const
templateil T read()
{
rg T data=0;
rg int w=1;
rg char ch=getchar();
while(!isdigit(ch))
{
if(ch=='-')
w=-1;
ch=getchar();
}
while(isdigit(ch))
{
data=data*10+ch-'0';
ch=getchar();
}
return data*w;
}
templateT read(T&x)
{
return x=read();
}
using namespace std;
typedef long long ll;

struct Point

{

int x,y;

Point(int x=0,int y=0)
:x(x),y(y){} bool operator<(co Point&rhs)co
{
return x<rhs.x||(x==rhs.x&&y<rhs.y);
} bool operator==(co Point&rhs)co
{
return x==rhs.x&&y==rhs.y;
}

};

typedef Point Vector;

Vector operator-(co Point&A,co Point&B)

{

return Vector(A.x-B.x,A.y-B.y);

}

int Cross(co Vector&A,co Vector&B)

{

return A.xB.y-A.yB.x;

}

int Dot(co Vector&A,co Vector&B)

{

return A.xB.x+A.yB.y;

}

int Dist2(co Vector&A,co Vector&B)

{

return (A.x-B.x)(A.x-B.x)+(A.y-B.y)(A.y-B.y);

}

vectorConvexHull(vector&p)

{

sort(p.begin(),p.end());

p.erase(unique(p.begin(),p.end()),p.end());

int n=p.size();
int m=0;
vector<Point>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;

}

int Diameter2(vector&points)

{

vectorp=ConvexHull(points);

int n=p.size();

if(n1)

return 0;

if(n2)

return Dist2(p[0],p[1]);

p.push_back(p[0]); // avoid %

int ans=0;

for(int u=0,v=1;u<n;++u)

{

for(;

最新文章

  1. ASP.NET Core中的依赖注入(5): ServiceProvider实现揭秘 【总体设计 】
  2. BZOJ 1260&amp;UVa 4394 区间DP
  3. NET基础(3):is 和 as 操作符
  4. jQuery 增加 删除 修改select option .
  5. C++ list size()所想到的事情
  6. 一起来学node.js吧 node school简介
  7. Leetcode: 132 Pattern
  8. Oracle数据库说明
  9. 关于List泛型的强制转换
  10. [四]SpringMvc学习-对servlet与json的支持与实现
  11. 深度解析MySQL启动时报“The server quit without updating PID file”错误的原因
  12. Java Web 高性能开发,第 3 部分: 网站优化实战
  13. linux和windows下,C/C++开发的延时函数,sleep函数
  14. 在UnrealEngine中用Custom节点实现马赛克效果
  15. 安装Drush工具 -Centos
  16. 毕业设计 之 三 mooodle及bigbluebutton使用笔记(未完成)
  17. iOS项目之“返回”手势操作相关
  18. golang相关网摘
  19. stark组件开发之列表页面定制列
  20. 转载-增删改查sql语句语法

热门文章

  1. EasyUI中datagrid双击事件
  2. codeforces 703B
  3. 查找java程序进程快速指令jps
  4. orecle常用函数
  5. 利用ECharts开发的步骤
  6. idea绿色版+谷歌浏览器绿色版——设置打开jsp文件
  7. web前端调优
  8. angularjs1 自定义轮播图(汉字导航)
  9. android传感器使用
  10. Android 性能测试小工具 Emmagee