题目大意:给你$n$个点,求出其中最远点的距离

题解:求出凸包,最远点一定都在凸包上,可以对每条边求出最远的点(可以双指针),然后求出和这条边的端点的距离,更新答案

卡点:最开始对每个点求出最远点,但这样并不可以双指针怎么搞。

C++ Code:

#include <cstdio>
#include <algorithm>
#define maxn 50010
int __X, __Y;
inline int sqr(int x) {return x * x;}
struct Point {
int x, y;
inline Point() {}
inline Point(int __x, int __y) : x(__x), y(__y) {}
inline int abs2() {return sqr(x) + sqr(y);}
inline friend Point operator - (const Point &lhs, const Point &rhs) {
return Point(lhs.x - rhs.x, lhs.y - rhs.y);
}
inline friend Point operator + (const Point &lhs, const Point &rhs) {
return Point(lhs.x + rhs.x, lhs.y + rhs.y);
}
inline friend int operator * (const Point &lhs, const Point &rhs) {
return lhs.x * rhs.y - rhs.x * lhs.y;
}
void writeln() {
printf("(%d, %d)\n", x, y);
}
} O, s[maxn], v[maxn]; inline int abs2(const Point &x) {return sqr(x.x) + sqr(x.y);}
inline int dis2(const Point &lhs, const Point &rhs) {return abs2(lhs - rhs);}
inline int det(const Point O, const Point &lhs, const Point &rhs) {
return (lhs - O) * (rhs - O);
}
inline bool operator < (const Point &lhs, const Point &rhs) {
Point X = lhs - O, Y = rhs - O;
int tmp = X * Y;
return (tmp > 0) || (!tmp && abs2(X) > abs2(Y));
} int n, miny, ans, tot;
int main() {
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d%d", &s[i].x, &s[i].y);
if ((s[i].y < s[miny].y) || (s[i].y == s[miny].y && s[i].x < s[miny].x)) miny = i;
}
if (n == 2) {
printf("%d\n", dis2(s[0], s[1]));
return 0;
}
std::swap(s[0], s[miny]);
O.x = s[0].x, O.y = s[0].y;
std::sort(s + 1, s + n);
v[tot++] = s[0], v[tot++] = s[1], v[tot++] = s[2];
for (int i = 3; i < n; i++) {
for (Point a = v[tot - 2], b = v[tot - 1]; tot > 2 && det(a, b, s[i]) <= 0; a = v[tot - 2], b = v[tot - 1]) tot--;
v[tot++] = s[i];
}
int now = 1;
for (int l = 0, r, D, tmp; l < tot; l++) {
r = (l + 1) % tot;
D = det(v[l], v[r], v[now]);
while (D < (tmp = det(v[l], v[r], v[(now + 1) % tot]))) D = tmp, now = (now + 1) % tot;
ans = std::max(ans, std::max(dis2(v[l], v[now]), dis2(v[r], v[now])));
}
printf("%d\n", ans);
return 0;
}

  

最新文章

  1. Unity3d学习 制作地形
  2. c# Entity DbArithmeticExpression arguments must have a numeric common type
  3. 元素的click与dblclick
  4. hg 的使用简介
  5. redis 五种数据类型的使用场景
  6. python的应该关注的语法
  7. JAVA的整型与字符串相互转换
  8. eq相等 ne、neq不相等, gt大于, lt小于 gte、ge大于等于 lte、le 小于等于 not非 mod求模 等
  9. C#垃圾回收机制(GC)
  10. ios 代码截屏模糊问题解决办法
  11. Java网络连接之HttpURLConnection、HttpsURLConnection
  12. shell参数处理模板
  13. DotNetCore 定时服务 HangFire
  14. C# 获取版本号
  15. Python数据分析学习(二):Numpy数组对象基础
  16. CentOS挂载光盘
  17. Java课程作业之动手动脑(二)
  18. LINUX CentOS7安装字体库
  19. Web性能压力测试工具之WebBench
  20. Codeforces 140D - New Year Contest

热门文章

  1. Java:IDEA设置虚拟机运行时参数
  2. 关联分析FPGrowth算法在JavaWeb项目中的应用
  3. 接口测试工具postman(八)上传文件接口
  4. JAVA基础学习之路(三)类定义及构造方法
  5. chorme打开网页的技巧
  6. LeetCode 95——不同的二叉搜索树 II
  7. Python3 小工具-UDP发现
  8. 【转】Backbone.js学习笔记(二)细说MVC
  9. 用逗号隔开简单数据保存为csv
  10. Alpha 冲刺2