LA 2797 Monster Trap
1. 姿势,学习学习, 做法就是将每条线段都延长一些些, 然后判断点到点是否可以直接到达再bfs。
2. 最重要的就是避免穿墙, 除了书上讲的情况外,还要排除
0 0 4 0
1 0 2 0
这一组数据
或者
0 0 2 0
2 0 4 0
这一组数据
当然,如果判断点在线段上的条件不同对这组数据的鲁棒性就不同。
//这道题 你将线段延长多少 和你的eps设成多少 需要达到蜜汁平衡 ……或许是因为我根本不懂计算几何的精度……需要学习
代码:http://paste.ubuntu.com/24460671/
LA 2218 Triathlon
刚好这段时间 wannafly 推荐了一道只有两种路途的 codeforces 536C
总之先将一个人胜过另外一个人的条件等式列出来,具体用半平面交或者是凸包啊什么的列出来了才能知道。
代码:http://paste.ubuntu.com/24459705/
UVA 11726 Crime Scene
题意: 给一些圆或者多边形, 用最短的绳子将其包裹
这个题意就很凸包
处理方法就是把各种切线上在圆上的点都加入到点集中, 在圆内部的点删除,再做凸包, 特殊情况就是只有一个圆的情况
第一次交的时候犯了个错误:
计算圆上a点到b点的弧的弧度的时候,写了一个函数返回的是两半径的夹角。 显然函数只能返回 [0, pi] 优弧就算不出来
求一种角度 (比如弧度、两线夹角) 转化为另外一种角度的时候一定要注意值域是否前后一样
代码:http://paste.ubuntu.com/24459746/
UVA 12307 Smallest Enclosing Rectangle
分别用边长最小、面积最小的矩形包裹凸包
之前做过30个点的poj 最小正方形包裹凸包的题目, 那题是三分的, 并且凸包可能没有一条边和正方形重合
这道题三分的话会超时, 特点是矩形至少有一条边是和凸包的边重合的
做法就是同时转四条边的旋转卡壳, 照着挑战上的思路改了一波
代码: http://paste.ubuntu.com/24459775/
LA 3218 Find the Border
题意: 找出PSLG的边界
/*
首先确定这道题用的算法就是LRJ讲的 “类似卷包裹” 算法,但是在应用这个算法的时候有一个关键点, 线段(直线)是否可以非规范相交
这道题, 包括后面的Street Crossing EXTREME都表明是只能规范相交的,这样题目就比较简单,只需要按照LRJ说的那样(下一行)找下一条边就可以了
-----转弯时如果有多条路可以走,选择那条右转得最厉害的线段。
另外还要注意是否可能三点共线
Art of War好像就是一道可以非规范相交的题目
代码: http://paste.ubuntu.com/24471626/
*/
如果看过刘汝佳的代码的话会发现套下板子就没有了
我认为这个知识点 《入门经典》上写的太模糊,太少了,甚至和他的代码有一定的出入
建议看一下他LA3218的代码
学习PSLG模板后代码:http://paste.ubuntu.com/24485461/
UVA 12296 Pieces and Discs
套板找出不同的块
关键是判圆与多边形是否相交,我第一相反,用之前那个求相交面积的方法,不等于0就是相交
但是写完之后运行发现,求出来的误差实在太大,不相交时面积可能到达3e-12甚至1e-10 而我的eps设置的是1e-12的
思考后我认为,这样求交面积,总共要进行poly.size()次运算,就有可能导致误差的累积
最后老老实实的抄了LRJ的方法,每次运算的结果都单独用于判断(比如说计算一次交点..判断某个点是否在圆内)。
就是自己分类讨论的话未必能讨论清楚。
代码: http://paste.ubuntu.com/24485487/
uva 11595 Crossing Streets EXTREME
划分出区域后,以每个多边形做无向图中的一个节点,判断起点与终点落在哪个多边形中,做最短路就可以了
我在做这道题的时候,在外面套了一个边长为 2inf 的正方形, inf 设小了会WA我知道。 设大了就不能正确找出所有区域,这我就不是很能理解了,可能又是精度误差的锅。
当然这个边长其实可以动态设置。
代码:http://paste.ubuntu.com/24485527/
LA 3176 Art of War
不能理解为什么我的代码不能找出每个首都属于的多边形, 会RE,还弄不到数据……
计算几何暂时告一段落, 之后刷CF、区域赛的计算几何,大白的题目有些真的有点年头了