凸多边形 | ||||||
|
||||||
Description | ||||||
已知一个凸多边形A(包含n个点,点按照顺时针给出),和一个点集B(包含m个点),请判断这m个点是否都严格在凸多边形A内部。 |
||||||
Input | ||||||
输入包含多组测试数据。 对于每组测试数据: 第1行,包含一个整数n (3?≤ n ≤?105)代表着凸多边形A的点的数量。 接下来n行每行包含一个坐标(x, y) (-109 ≤ x, y ≤?109) 表示这个凸多边形,点按照顺时针给出。 第n + 2行,包含一个整数m (3?≤ m ≤?105)代表着点集B的点的数量。 接下来m行每行包含一个坐标(x, y) (-109 ≤ x, y ≤?109) 表示这个点集B。 处理到文件结束 |
||||||
Output | ||||||
对于每组测试数据: 第1行,如果点集B都严格在凸多边形A内,输出YES,否则输出NO。 |
||||||
Sample Input | ||||||
4 -10 -10 -10 10 10 10 10 -10 3 0 0 1 1 2 2 4 -10 -10 -10 10 10 10 10 -10 3 100 100 1 1 2 2 |
||||||
Sample Output | ||||||
YES NO
正常暴力用叉乘跑的话肯定会超时,这里学习到了一种新姿势解决这类问题
计算几何之判断点是否在多边形内, 判断点是否在多边形内有多种方法:射线法,角度和判断法,改进弧长法还有这次用到的二分法。 前三者的时间复杂度均为O(n),此方法复杂度仅为O(logn)。 而且对于判断很多点是否在多边形内,就可以用这种方法了,耗时少。 原理: 将一个多边形,以其中一个点为原点,开始与其他各点相连并延长做射线,则会形成许多个三角形区域。(如左图) 这样我们可以先判断点在哪两条向量之间。用二分查找,可以很快搜索到。 当然,首先要判断点是否在最左边向量左侧或者最右边向量右侧,如是,则点不在多边形内。 以右图为例,我们找到紫色点在左数第一个三角形区域内,绿色点在左数第二个三角形区域内。 然后,再判断下图所示线段与 所判断点的位置关系。 绿色的线段可以判断绿色的点,左边紫色的点也由相应的线段来判断位置关系。 这样可以判断点是否在多边形内啦。 总结一下: ①建立一个个三角形区域,用其中两条边判断点所在大体区域。 ②用第三条边来判断点是否在多边形内。 二分查找就是用在了第一条的地方,用来查找大体区域位置。 明白了这个,就可以做相应的题目来练习一下了! 就是这道题~。~
|
详细解决方案
Hust oj 1429 凸多边形(叉乘+二分)
热度:17 发布时间:2023-12-22 04:18:20.0
相关解决方案
- Hdu 1429 胜利大逃亡(续) (bfs+状态压缩)
- luogu 1429 平面最近点对(加强版)
- 2618: [Cqoi2006]凸多边形
- 【HDU - 1429】胜利大逃亡(续) 【状态压缩+BFS】
- BFS——1429 胜利大逃亡(续)
- HUST 1214 Cubic-free numbers II(区间n=x^3*k的n的个数、枚举x容斥)
- HUST-大整数排序
- HUST-奇偶校验
- HUST-找位置
- HUST-阶乘
- HUST-回文字符串
- HUST-排序
- HUST-统计单词
- HUST-矩阵转置
- python多点外接多边形(Delaunay三角网),凸多边形、非凸多边形
- Hust oj 1813 小乐乐要下山(dp + 路径还原)
- Hust oj 1861 猥琐宅男——koko(DP)
- Hust oj 1293 取数(Map)
- Hust oj 1160 吸血鬼(并查集)
- Hust oj 1429 凸多边形(叉乘+二分)
- Hust oj 1630 网线(MST)
- Hust oj 1987 逃课的孩子(Map)
- Hust oj 1926 函数式计算(二分)
- Hust oj 1921 三原色(改进版)(容斥原理)
- Hust oj 1953 RSA验证(快速幂)
- Hust oj 1949 寻找宝藏(BFS)
- Hust oj 1929 走三方,路迢迢水长长(递推)
- Hust oj 1944 皮卡丘(同蚂蚁感冒)
- Hust oj 1431 摞盘子(水题)
- Hust oj 1629 统计图(水题)