旋转卡壳——模板(对踵点)
这东西学了我大概两天吧。。其实不应该学这么久的,但是这两天有点小困,然后学习时间被削了很多\(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
旋转卡壳——模板(对踵点)相关推荐
- Beauty Contest(凸包 + 旋转卡壳(模板))
Beauty Contest 直接跑一个凸包,然后跑一跑旋转卡壳,求最大值就行了. /*Author : lifehappy */ #include <cstdio> #include & ...
- 旋转卡壳凸包(不用一下子就学完所有)
目录 前言 参考博客 前置知识 1.极角排序 2.凸包(默认逆时针) 3.对踵点 旋转卡壳能解决的各类问题 1.计算距离 1.1凸多边形直径 1.2凸多边形宽 1.3凸多边形间最大距离 1.4凸多边形 ...
- 算法复习——凸包加旋转卡壳(poj2187)
题目: Description Bessie, Farmer John's prize cow, has just won first place in a bovine beauty contest ...
- POJ - 2187 Beauty Contest (求距离最远点对-凸包+旋转卡壳/枚举 (旋转卡壳学习))
链接:https://vjudge.net/problem/POJ-2187 题意:求求距离最远点对. 思路:肯定为凸包上的点,可枚举,也可根据凸包性质旋转卡壳求对踵点. 参考博客: https:// ...
- 模板:旋转卡壳(计算几何)
所谓旋转卡壳,就是旋转起来的卡壳 (逃) 前言 前置知识:凸包 个人感觉很像 two-pointers 算法. 能够在优秀的线性时间复杂度内完成总多求最值(周长.面积-)的神奇操作. 解析 给出情境: ...
- POj2187 【模板】旋转卡壳 / 选美大赛
POj2187 [模板]旋转卡壳 / 选美大赛 题目描述 农夫约翰奖的牛贝西(Bessie)刚刚在牛选美比赛中获得第一名,并获得了"牛世界小姐"的头衔.结果,贝茜将参观世界各地的N ...
- [模板] 计算几何2: 自适应Simpson/凸包/半平面交/旋转卡壳/闵可夫斯基和
一些基本的定义在这里: [模板] 计算几何1(基础): 点/向量/线/圆/多边形/其他运算 自适应Simpson Simpson's Rule: \[ \int ^b_a f(x)dx\approx ...
- 最远对踵点 旋转卡壳
original link - http://poj.org/problem?id=2187 题意: 求最远点对 推荐 https://blog.csdn.net/wang_heng199/artic ...
- 算法学习:计算几何旋转卡壳
[定义] [对踵点]多边形上存在平行切线的两点 [多边形半径]多边形上任意两点的最大长度 [旋转卡壳] 选取y轴上,最高和最低的两个点,令两条平行于x轴的线切过这两点 然后我们开始让这两条线旋转 当一 ...
最新文章
- 当我们不为了拿奖,而在做事情的时候
- 频繁项集挖掘之apriori和fp-growth
- Linux的性能故障的含义,Linux排查性能故障的方法
- LeetCode 258. 各位相加
- 信息学奥赛C++语言: 计算两个数的最大公约数
- Mysql执行计划的extra列及filesort祥析
- 记录——《C Primer Plus (第五版)》第十章编程练习第十题
- EasyUI Tree添加节点
- Viewpage+Fragment
- php 网页转换成pdf文件格式,将网页HTML转换成PDF格式文件的几种办法
- 提高IT团队工作效率的建议
- hl uoj1841 走格子
- 敏捷-《如何准备ACP考试》知识图谱
- 破解微信数据库 并查询数据上传服务器
- 服务端发现2t3ik.p进程占CPU过高。2t3ik ddgs.3011
- OMCI协议二层功能的模型选择
- 介绍一款软件卸载工具IObit
- Python爬取豆瓣+数据可视化
- SDNUOJ 1703.字谜|STL库中map的使用/map映射
- Android音频边录边放
热门文章
- C++拾趣——使用多态减少泛型带来的代码膨胀
- Makefile语法基础介绍
- C++ 简单读写文本文件、统计文件的行数、读取文件数据到数组
- 【C++】Effective STL:50条有效使用STL的经验
- 取代java_如何评价 Kotlin?未来是否会取代 Java?
- 计算机组装cpu用哪种好,教你电脑处理器哪款好
- Java项目:在线考试系统(java+springboot+vue+jsp+mysql+maven)
- 函数 tostring_Kotlin实战之Fuel的高阶函数
- 【光纤通信】关于RFA(喇曼光纤放大器)
- 【基础知识】如何在word中粘贴出漂亮整洁的代码