大白书-第4章-几何问题
文章平均质量分 78
冷月残星
这个作者很懒,什么都没留下…
展开
-
移动微小的距离,线段相交,计算几何(怪物陷阱,LA 2797)
迷之精度问题,一开始WA,然后把eps从1e-10改成1e-12就AC了,完全没有任何道理啊。。。亲测当且仅当[11,14]才能AC。估计是伸长时,某些向量长度太短或方向太偏,加上伸长的长度太小,从而导致OnSegment函数判断错误,从而导致WA的。只能说以后这种题的精度还得在[10,15]里面慢慢试。算是没用的,二分也是没用的,如果WA了,你怎么知道该往上调还是往下调?(然而最可怕原创 2017-02-04 16:38:44 · 285 阅读 · 0 评论 -
线性规划,半平面的交(铁人三项,LA 2218)
Vector(B,-A)这个向量简直神奇。无论A,B,C的符号关系如何,这个向量所代表的半平面总是对的。然后精度问题的解决办法就是乘以一个较大的数,或者乘以公倍数以保证无小数。求直线交点的函数又喜闻乐见地写错了。。。代码#include#define SUM (U[i]*V[i]*W[i]*U[j]*V[j]*W[j])using namespace原创 2017-02-02 15:09:55 · 660 阅读 · 0 评论 -
半平面的交,二分法(离海最远的点,LA 3890)
太菜啦,这都不会。。。点到海的距离是点到海的最小距离,然后想让这个值最大。想到了啥?不就是应该用二分吗?太菜了。把这个n个点的凸多边形的岛看做n个半平面的交。二分距离,检查是否存在一个距离海这么远的点,具体做法就是将所有半平面对应的直线往左边移动这么远,然后看看交是否为空即可。代码#includeusing namespace std;const int m原创 2017-02-01 20:42:02 · 292 阅读 · 0 评论 -
旋转卡壳,凸包直径(正方形,LA 4728)
学会了旋转卡壳算法,自己实现的,可以整理成模板。妈蛋WA了,然后自己带了几个简单数据也没找到错误,最后发现原来是点乘都写错了,Rotate都忘记带acos,叉乘正负都搞反了。。。只能说这种模板或公式写错或抄错好糟糕,然后自己带的样例也太简单,太特殊,所以甚至连这么大的bug都查不出来。有时候如果带数据找不出错的话,可以尝试仔细审阅一遍代码,审阅时时偏重检查细节实现。或者单步调试也可以,哪怕原创 2017-01-31 14:18:55 · 379 阅读 · 0 评论 -
判断凸包相离(点集划分,uva 10256)
如何判断两个凸包是否相离呢?需要检查(1)两个凸包上的线段是否彼此相交,如果线段彼此相交,那么就一定不相离。(说明边界有公共部分)(2)任意一个点是否在另一个凸包内,如果找到了那么一个点在另一个凸包内,那么就一定不相离。(说明内部有公共部分)(3)对于退化成点和线段的凸包要特殊判断。代码#includeusing namespace std;const int原创 2017-01-30 22:07:36 · 727 阅读 · 0 评论 -
直线的旋转与相交,计算几何(Morley定理,uva 11178)
计算几何基础题以后还是少瞄答案,看分析做没用的,把分析以下的部分遮住即可。代码#includeusing namespace std;struct Point{ double x,y; Point(double x=0,double y=0):x(x),y(y){}};typedef Point Vector;Point read(){原创 2017-01-28 21:08:58 · 323 阅读 · 0 评论 -
直线交点,欧拉定理,计算几何(好看的一笔画,LA 3263)
自己写得手忙脚乱的,而标程好简洁。我发现这种情况有一个特点,那就是我总想着一次性搞定一些东西,而不是分两次。比如此题,我总想着一次性求出e与v,而不是先求出v再慢慢求e。可能是因为做算法题做习惯了,总是追求高效率,但是自己追求高效率的方法是不对的,总是希望一次性求出所有东西。事实上这样效率不但没有显著提高,还会把程序结构弄得乱七八糟,从而导致出现各种奇奇怪怪的bug,然后也很难看清思路与检原创 2017-01-29 01:16:49 · 715 阅读 · 0 评论 -
两线段间的距离,三分法,计算几何(狗的距离,uva 11796)
因为行迹是变化莫测的,所以很难从整体上求出最优解。但是行迹是由多个线段组成,而在两个线段上的行迹的最优解却是十分有规律的。那就是最远距离必在端点处,而最近距离必是一个关于时间的凹函数。因此我们可以将所有到达端点的时间点进行离散化,那么在相邻的两个时间点之间,两只狗一定分别在某两条线段上移动,因此可以利用参数方程得到具体的坐标与时间的关系。而针对这一时间段,我们只需要将端点带入便可求得局部的最远距离原创 2017-01-29 13:28:05 · 2729 阅读 · 0 评论 -
圆与直线的大综合,计算几何(二维几何110合一!,uva 12304)
WA了无数发。。。没有仔细看书,漏掉了排序。。。然后还有一些关于精度的错误,那就是少用rotate,后来找到了两个地方的精度错误都是因为用了rotate。。。然后就没有什么的啦,这就是一道抄模板的题目。前两个问题可以用公式求,又快又好。第四个问题要把eps放低才能过样例,1e-6就好,虽然大白书上说不推荐这样做,但是这往往是我们在赛场上的第一反应。代码#incl原创 2017-01-29 23:14:48 · 330 阅读 · 0 评论 -
圆盘覆盖,计算几何(圆盘问题,LA 2572)
就是自己不会做呀,不知道该如何判断一个圆盘是否被其他圆盘覆盖了,想通过判断交点是否满足某些条件来判断是否覆盖,但就是很难找到一些的简单的规律吧。然后看大白书做的。题目说,就算输入数据有+-5e-13的变化,答案仍然不会有变化。①这句话十分值得注意,它不是在对你作精度要求,而是在告诉你圆盘的可见部分或不可见部分都具有一定的大小。换句话说,如果我们把eps设得更小一点(这无所谓,只原创 2017-01-30 14:19:45 · 2759 阅读 · 0 评论 -
凸包,点到直线距离(飞机场,uva 11168)
大白书又没说清楚,明明找的是平均距离,却说是距离和。。。关于debug,考虑极端数据。然后我用的是O(n^2)的算法,太糟糕了。想要算法高效,思路大致都是通过维护某些量或者预处理一些值或者利用公式将某一重循环省掉,但可能需要付出额外的代价,往往是将某个O(n)降为O(longn)或O(1)。至于该如何去发现这些优化点,我想自己应该多关注那些看上去很邋遢的循环,然后找到待求量的特原创 2017-01-30 17:26:16 · 402 阅读 · 0 评论 -
凸包,多边形面积(包装木板,uva 10652)
模板题代码#includeusing namespace std;const int maxn = 2500;struct Point{ double x,y; Point(double x=0,double y=0):x(x),y(y){} bool operator < (const Point& rhs) const {原创 2017-01-30 16:05:58 · 260 阅读 · 0 评论 -
三维几何,四面体(压纸器,LA 4795)
学会了求四面体重心的公式和算法。注意讨论清楚四点共面的情况。最后是求芯片到底的距离而不是重心到底的距离。。。理解题意是你的硬伤哎。。其实就是没有用心看,用心想,总是胡乱看一遍然后自己脑补。代码#include#includeusing namespace std;struct Point3{ double x,y,z; Point3原创 2017-02-06 21:08:45 · 492 阅读 · 0 评论 -
三维三角形(三维三角形,UVA 11275)
很容易想到判断是否存在一个三角形的一条边经过另一个三角形。用大白上的模板即可。但是模板直接无视了线段在平面上的情况呀。而且还AC了呀。。。如果非要判断的话,可以看线段是否与三角形某条边相交(允许端点)。代码#includeusing namespace std;struct Point3{ double x,y,z; Point3(doubl原创 2017-02-06 17:13:39 · 1855 阅读 · 0 评论 -
切割凸多边形,圆与多边形(块和圆盘,UVA 12296)
还以为要用卷包裹的方法求出所有区域呢。。。然后不会啊。。。事实上可以用切割凸多边形的方法来求出所有区域。大白上有切割凸多边形的模板,在P277。然后遍历所有圆,找到所有与之相交的多边形即可。在这个过程中需要判断圆与多边形之间的关系。大白上讲得很清楚了。就是如果完全没有公共点,那就判断是否互相包含。具体一点就是看圆心是否在凸多边形内,凸多边形的任意一个点是否在圆内。否则他们一原创 2017-02-06 16:34:48 · 626 阅读 · 0 评论 -
三维线段距离,分数类(Ardenia王国,LA 4973)
关于WA:大白上说不平行或重合就异面。。。都没考虑相交。。。我是因为没讨论清楚+异面直线公式错了+分数类运算爆longlong。关于没讨论清楚:平行,重合要特判。相交直接输出0。异面的话s和t要在[0,1],否则特判。关于异面直线公式错了:我没用大白上的代码,看不懂,算出来答案也是错的,不知道为什么。。。自己的算法就是用二维的点到线段距离模板,错了,也不知道为什么。。。最好只好原创 2017-02-06 16:20:59 · 359 阅读 · 0 评论 -
卷包裹,线段相交,计算几何(找边界,LA 3218)
成吨的细节。。。然后如何找右转得最厉害的线段呢?原创 2017-02-04 22:34:49 · 290 阅读 · 0 评论 -
贪心,二分,半平面交(丛林警戒队,LA 4992)
RE的6种可能1、数组开小了2、数组越界了3、除0了4、递归爆栈了5、指针6、申请空间过多了。还是感觉自己有问题,码得太多,想的太少,实践得更少。自己先跟自己玩玩攻防游戏,多玩几盘,就知道正确的防守方法了,然后思路与代码就是分分钟的事情。先抛开代码与算法不管,然后搞出一种手算的解决方案(像玩单机游戏那样去不断尝试),最后再想办法用代码去实现。原创 2017-02-02 20:41:05 · 386 阅读 · 0 评论