这东西学了我大概两天吧。。其实不应该学这么久的,但是这两天有点小困,然后学习时间被削了很多\(QwQ\)

说几个坑点。

- 对于题目不保证有凸包的情况,要选用左下角的点,而非单纯的最下边的点构造凸包。

- 对于凸包中只有\(1/2\)个点的情况,要注意特殊判断。

算法流程就比较简单了。先构造一个凸包,然后利用对踵点都是逆时针跑(类似于两把尺子卡着凸包转)的原理,每次判断到当前直线距离最远的点,更新当前对踵点即可。

例题 【luogu P1452】Beauty contest

#include <bits/stdc++.h>
#define N 50010
using namespace std;struct point {int x, y;
}arr[N], hull[N];int n, top;int cross (point u1, point u2, point v1, point v2) {return (u2.x - u1.x) * (v2.y - v1.y) - (u2.y - u1.y) * (v2.x - v1.x);
}int point_dis (point u, point v) {return (v.x - u.x) * (v.x - u.x) + (v.y - u.y) * (v.y - u.y);
}bool cmp (point lhs, point rhs) {if (cross (arr[1], lhs, arr[1], rhs) < 0) return false;if (cross (arr[1], lhs, arr[1], rhs) > 0) return true;return point_dis (arr[1], lhs) < point_dis (arr[1], rhs);
}void get_hull () {sort (arr + 2, arr + 1 + n, cmp);hull[++top] = arr[1];for (int i = 2; i <= n; ++i) {while (top > 1 && cross (hull[top - 1], hull[top], hull[top], arr[i]) <= 0) --top;hull[++top] = arr[i];}hull[top + 1] = arr[1];
}int get_ans () {if (top == 1) return 0;if (top == 2) return point_dis (hull[1], hull[2]);int v = 2, ans = 0;for (int u = 1; u <= top; ++u) {while (cross (hull[u], hull[u + 1], hull[u + 1], hull[v]) <=cross (hull[u], hull[u + 1], hull[u + 1], hull[v + 1])) {v = v == top ? 1 : v + 1;}ans = max (ans, max (point_dis (hull[u], hull[v]), point_dis (hull[u + 1], hull[v])));}return ans;
}int main () {cin >> n;for (int i = 1; i <= n; ++i) {cin >> arr[i].x >> arr[i].y;if (arr[i].y < arr[1].y || (arr[i].y == arr[1].y && arr[i].x < arr[1].x)) {swap (arr[i], arr[1]);}}get_hull ();cout << get_ans () << endl;
}

转载于:https://www.cnblogs.com/maomao9173/p/10395499.html

旋转卡壳——模板(对踵点)相关推荐

  1. Beauty Contest(凸包 + 旋转卡壳(模板))

    Beauty Contest 直接跑一个凸包,然后跑一跑旋转卡壳,求最大值就行了. /*Author : lifehappy */ #include <cstdio> #include & ...

  2. 旋转卡壳凸包(不用一下子就学完所有)

    目录 前言 参考博客 前置知识 1.极角排序 2.凸包(默认逆时针) 3.对踵点 旋转卡壳能解决的各类问题 1.计算距离 1.1凸多边形直径 1.2凸多边形宽 1.3凸多边形间最大距离 1.4凸多边形 ...

  3. 算法复习——凸包加旋转卡壳(poj2187)

    题目: Description Bessie, Farmer John's prize cow, has just won first place in a bovine beauty contest ...

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

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

  5. 模板:旋转卡壳(计算几何)

    所谓旋转卡壳,就是旋转起来的卡壳 (逃) 前言 前置知识:凸包 个人感觉很像 two-pointers 算法. 能够在优秀的线性时间复杂度内完成总多求最值(周长.面积-)的神奇操作. 解析 给出情境: ...

  6. POj2187 【模板】旋转卡壳 / 选美大赛

    POj2187 [模板]旋转卡壳 / 选美大赛 题目描述 农夫约翰奖的牛贝西(Bessie)刚刚在牛选美比赛中获得第一名,并获得了"牛世界小姐"的头衔.结果,贝茜将参观世界各地的N ...

  7. [模板] 计算几何2: 自适应Simpson/凸包/半平面交/旋转卡壳/闵可夫斯基和

    一些基本的定义在这里: [模板] 计算几何1(基础): 点/向量/线/圆/多边形/其他运算 自适应Simpson Simpson's Rule: \[ \int ^b_a f(x)dx\approx ...

  8. 最远对踵点 旋转卡壳

    original link - http://poj.org/problem?id=2187 题意: 求最远点对 推荐 https://blog.csdn.net/wang_heng199/artic ...

  9. 算法学习:计算几何旋转卡壳

    [定义] [对踵点]多边形上存在平行切线的两点 [多边形半径]多边形上任意两点的最大长度 [旋转卡壳] 选取y轴上,最高和最低的两个点,令两条平行于x轴的线切过这两点 然后我们开始让这两条线旋转 当一 ...

最新文章

  1. 当我们不为了拿奖,而在做事情的时候
  2. 频繁项集挖掘之apriori和fp-growth
  3. Linux的性能故障的含义,Linux排查性能故障的方法
  4. LeetCode 258. 各位相加
  5. 信息学奥赛C++语言: 计算两个数的最大公约数
  6. Mysql执行计划的extra列及filesort祥析
  7. 记录——《C Primer Plus (第五版)》第十章编程练习第十题
  8. EasyUI Tree添加节点
  9. Viewpage+Fragment
  10. php 网页转换成pdf文件格式,将网页HTML转换成PDF格式文件的几种办法
  11. 提高IT团队工作效率的建议
  12. hl uoj1841 走格子
  13. 敏捷-《如何准备ACP考试》知识图谱
  14. 破解微信数据库 并查询数据上传服务器
  15. 服务端发现2t3ik.p进程占CPU过高。2t3ik ddgs.3011
  16. OMCI协议二层功能的模型选择
  17. 介绍一款软件卸载工具IObit
  18. Python爬取豆瓣+数据可视化
  19. SDNUOJ 1703.字谜|STL库中map的使用/map映射
  20. Android音频边录边放

热门文章

  1. C++拾趣——使用多态减少泛型带来的代码膨胀
  2. Makefile语法基础介绍
  3. C++ 简单读写文本文件、统计文件的行数、读取文件数据到数组
  4. 【C++】Effective STL:50条有效使用STL的经验
  5. 取代java_如何评价 Kotlin?未来是否会取代 Java?
  6. 计算机组装cpu用哪种好,教你电脑处理器哪款好
  7. Java项目:在线考试系统(java+springboot+vue+jsp+mysql+maven)
  8. 函数 tostring_Kotlin实战之Fuel的高阶函数
  9. 【光纤通信】关于RFA(喇曼光纤放大器)
  10. 【基础知识】如何在word中粘贴出漂亮整洁的代码