![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
计算几何
月光下的魔术师
这个作者很懒,什么都没留下…
展开
-
扫描线算法
HDU1542 题解:求解矩阵的面积和。 代码 #include <bits/stdc++.h> using namespace std; int const N = 200; int T,n; struct Edge{ double x,y1,y2; int flag; Edge(double a,double b,double c,int d):x(a),y1(b)...原创 2020-06-24 17:40:26 · 501 阅读 · 0 评论 -
平面最近点对问题:luogu1429
luogu1429 解法:分而治之 分治 数组按x升序排序,调用递归函数。是为了得到区间的最近点对的长度。处理如下 以中间的数字为中心线进行分割,分别对和进行处理。 如果区间的长度比较小,可直接暴力计算,比如以下是。 合并 已知两边的最近点对的距离为mindist。现在mid两边各选择一个距离才有可能小于mindist。 我们把两边距离中心线距离小于mindist的点挑选出放入数组t。 对数组t按y进行升序,方便以下处理。 每次选择t中的一个点pi,再按顺序挑选pj,确定最短距离,直到不小原创 2020-05-18 20:18:22 · 195 阅读 · 0 评论 -
POJ3384:半平面交
POJ3384 题解 多边形向内部推进r个单位,判断是否存在半平面交。然后求新的多边形上距离最远的两点。直接暴力,不用旋转卡壳。 注意如果半平面交可能是一个点。 代码 #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include ...原创 2019-04-11 08:14:28 · 127 阅读 · 0 评论 -
POJ1584:计算几何
POJ1584 题解 首先要判断多边形使否是凸边形。对于连续的点a、b、c,就要判断ab×bc是否都是同号。 其次要判断圆心是否在多边形的内部,因为是凸边形,所以很好判断。对于连续的点a,b,c和圆心o,判断ba×bo和bc×bo的符号。如果存在同号,那么就是在外部。 最后就是判断圆心到边的距离和半径的关系了。 代码 #include <iostream> #include...原创 2019-04-01 18:49:14 · 146 阅读 · 0 评论 -
POJ2540:半平面交
POJ2540 题解 如果比之前更远,那么在两点的中垂线靠近之前的那边,反之另一边。 我们可以找出a和b的终点,在把确定向量ab,根据情况旋转90或270。 如果出现same那就不再计算 了。 代码 #include <iostream> #include <cstdio> #include <algorithm> #include <cstr...原创 2019-04-11 08:36:29 · 130 阅读 · 0 评论 -
稳定凸包:判断凸包的唯一性
POJ1228 题解 参考https://www.jianshu.com/p/1d056ac1c881 给你n个点,判断是否能唯一确定一个凸包。即判断是否为稳定凸包 判断是否一条边上有三个点 如果n < 6一定不满足条件,特判。 代码 #include <iostream> #include <cstdio> #include <algorithm...原创 2019-04-07 19:16:11 · 326 阅读 · 0 评论 -
POJ2318:二分+叉积
POJ2318 题解: n个纸板把矩形分成(n+1)个区域,m个玩具随机仍在里面,求每个区域的玩具的个数,区域编号从0开始到n。 二分查找点在哪个位置。如果点P在某条线段AB的左边(A在上面,B在下面),那么PA×PB<0。二分查找最近的线段的左边。 代码 #include <iostream> #include <cstdio> #include <...原创 2019-03-28 21:59:20 · 104 阅读 · 0 评论 -
POJ3304:直线与线段相交
POJ3304 题解 所有线段的投影都交于一点,相当于有一条直线的垂线经过所有的线段。 直线经过所有的点,我们可以旋转直线,使它恰好经过线段的两个端点,所有O(n^2)枚举端点。 判断ab直线和线段cd是否相交,只要判ab×ac和ab×ad的符号是否小于等于0。比判断线段和线段相交少一个条件。 最后注意重点的判断,因为叉积为0可能是直线和线段重合。 代码 #include <i...原创 2019-03-29 08:33:46 · 697 阅读 · 0 评论 -
直线与直线的关系判断、求交点:POJ1269
POJ1269 题解 两直线ab和cd平行:ab×cd = 0 两直线重合:在平行的基础上满足ac×ad = 0 否则求交点。 代码 #include <iostream> #include <cstdio> #include <algorithm> #include <cmath> #include <cstring> #i...原创 2019-03-29 09:33:19 · 187 阅读 · 0 评论 -
计算几何模板
定义 const double eps = 1e-8; int dcmp(double x){ //判断符号 if(fabs(x) < eps) return 0; else return x < 0 ? -1 : 1; } typedef struct Point{ //点和向量 double x,y; Point(){}; Point(double x,do...原创 2019-03-31 19:15:30 · 129 阅读 · 0 评论 -
POJ2451:半平面交模板题
POJ2451 代码 #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <cmath> #include <vector> using namespace std; double const eps...原创 2019-04-09 21:52:35 · 246 阅读 · 0 评论 -
LA3890:半平面交 + 二分
LA3890 题解 相当于求岛上半径最大的圆。 二分枚举半径r。把每一条边向里面平移r,如果存在这样的圆,那么平移后的存在半平面交。 代码 #include <bits/stdc++.h> using namespace std; const double eps = 1e-8; int const N = 100 + 10; int n; int dcmp(double x...原创 2019-04-10 23:33:46 · 133 阅读 · 0 评论 -
CF734E:缩点 + 树的直径
CF734E 题意: 一棵树上有黑白两种颜色的结点,每次可以把连通的一种颜色变成另一种颜色。求至少要多少次,才能是整棵树变为一种颜色。 题解 先求连通块,把颜色相同的连通块放在一起。不用Tarjan,dfs就可以直接搞定了。然后缩点。 然后就是求树的直径d,两次bfs搞定。最后答案就是(d + 1)/ 2。 理由是:可以由中间往外,一层一层的改变颜色。比如缩点后颜色分布为0 1 0 1 ...原创 2019-04-06 21:26:25 · 209 阅读 · 0 评论 -
POJ1265:pick定理
POJ1265 题解 皮克定理:给定顶点座标均是整点的简单多边形,其面积和内部格点数目、边上格点数目满足关系: 边上点的个数为gcd(abs(p[i-1].x-p[i].x),abs(p[i-1].y-p[i].y))(只包括一个端点的)。 这题不能pick定理求面积,而是先求出面积再用pick定理反推内部点的个数 代码 #include <iostream> #incl...原创 2019-04-04 14:55:36 · 129 阅读 · 0 评论 -
POJ1410:线段相交
POJ1410 题解:细节很多,需要注意 给出的矩阵左上角和右下角没有必然关系。 线段在矩阵内部也算相交。 规范相交和非规范相交都要考虑。 代码 #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <cmath&...原创 2019-03-31 10:04:10 · 1005 阅读 · 0 评论 -
极角排序:POJ1696
POJ1696 题解 先排序一次找到y最小的点最为起始点 然后以这个点为基准进行极角排序找到极角最小的点p。以p为基准再进行极角排序,以此类推。 代码 #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <cmat...原创 2019-03-31 14:23:19 · 212 阅读 · 0 评论 -
POJ2826:计算几何
POJ2826 题解:看似简单的题,却很考验综合能力 容量为0的情况 其中一条线段与x轴平行 两天线段平行或者重合 两条线段无交点 有交点,但一条线段的上半部分却覆盖掉了另外一条线段的上半部分。这里需要求斜率。 C++AC,G++WA的代码 代码 #include <iostream> #include <cstdio> #include <algo...原创 2019-03-31 16:22:00 · 151 阅读 · 0 评论 -
POJ2074:直线相交
POJ2074 题解 看着上面的图讲话。 就是求两条直线与最下面直线的交点。 注意如果障碍物不在h的下方或者不在r的上方,就不要计算了。 先对障碍物左端点排序,然后从左到右扫描。用一个标记last记录盲区的右端点,就是求(左端点 - last)的最大值。有一种情况可能是右端点坐标变小了,因为这一次的障碍物比上一次的还短。所以我们要保留右端点的最大值。 代码 #include &l...原创 2019-03-31 20:01:19 · 117 阅读 · 0 评论 -
POJ1066:线段交点
POJ1066 题解 方法很简单,就是边界上的每一个结点与终点的连线,与图中线段的交点的个数。最后还要加1,因为边界也要炸。 为什么这样子呢?因为只有跨越端点的时候才会改变交点数量。 代码 #include <iostream> #include <cstdio> #include <algorithm> #include <cstring>...原创 2019-03-31 20:11:24 · 131 阅读 · 0 评论 -
POJ1039:枚举+求交点
POJ1039 题解 我们把(xi,yi-1)--(xi,yi)作为一条垂直线段,那么一共有n条线段。 枚举任意两个点最为一条直线。从左开始枚举线段。 如果与每一条线段都能相交,那么就是全部穿越了。 如果与第一条线段不相交,那么这一条光线就不存在(无法在指定范围内发射)。 如果与第i条线段不相交,那么求直线与i,i-1上下两条线段的交点,求横坐标最大值。 代码:1A很舒服~ #inc...原创 2019-03-31 21:31:00 · 185 阅读 · 0 评论 -
POJ3347计算几何
POJ3347 题解 这道题的解法很神奇。与投影的区间范围有关。为了排除精度的误差,所以我们把边长同时扩大根号2倍。这样子对角线程度就是2倍边长。 怎么求左右端点的左边呢?假设求第i个正方形左端点,已知前i-1个,那么我们假设第i个与前面几个都相切,求左端点,然后取最大值。相切怎么求?画画图就很清楚了。 最后不断缩小左右端点的范围。只有边长长的才能覆盖边长短的。具体见代码。 代码 #i...原创 2019-04-01 09:18:22 · 195 阅读 · 0 评论 -
POJ1556:最短路+线段相交
POJ1556 题解 暴力任意两个点之间连线,判断有没有线段与之相交,没有求两点之间的距离。否则inf 跑最短路,floyd方便不超时。 我对点的处理有点麻烦 x号点和y号点之间的线段编号范围 1列:1,2,3,4包含边1 2 3 2列:5,6,7,8包含边4 5 6 3列:9,10,11,12包含边7 8 9 ………… 4n-3--4n点包含边3n-2--3n x点对应的列...原创 2019-03-30 20:54:09 · 156 阅读 · 0 评论