计算几何题集
转自:
http://www.cppblog.com/Felicia/category/4905.html?Show=All
计算几何
- [计算几何]pku1444 长方体旋转 摘要: 用递归旋转法解决长方体表面点的最近表面距离
阅读全文 - [计算几何]pku3293 摘要: 先按规则连。规则是隔一段连一个。比如一条直线上有6个点,就1-2,3-4,5-6,这么连。如果只有奇数个点,就不行。然后再判有没有洞。
方法是任选一个点,走一圈,看看是否遍历所有的点。
阅读全文 - [计算几何]pku3429 摘要: 直接按照题目意思模拟即可。关键是需要实现有理数运算。我的方法是重载运算符。
阅读全文 - [计算几何]pku3424 摘要: 先确定窗口左上角可能出现的区域,方法是对每个点确定这样一个区域,然后求交。接下来枚举窗口左上角,计算密码序列,插入一个set中。最后按字典序输出这个set。
阅读全文 - [计算几何]pku1379 摘要: 平面点的三角剖分应用。对输入点集进行三角剖分,求得对偶图Voronoi图,Voronoi图的结点以及边与矩形的边的交点就是可疑点。枚举可疑点,计算最优值就是答案。
阅读全文 - [计算几何]两个凸多边形的交 摘要: 两个凸多边形的交
阅读全文 - [计算几何]pku3407 摘要: 简单的几何题,先把经纬度换算成球面坐标,再把球面坐标换算成直角坐标,然后求夹角,乘半径得到球面距离
阅读全文 - [计算几何]pku3410 摘要: 我的做法是,枚举第一个多边形的第i条边和第二个多边形的第j条边重合,然后从这条重合的边开始,尽可能的向后扩展重合边,然后判断剩下的多边形是否是凸多边形。
比赛的时候,我在某个地方忘记对多边形点数求模,导致wa了很久,一直到比赛结束后才AC。以此为鉴!
阅读全文 - [计算几何]pku3391 摘要: 问题是求平面欧几里德最小生成树的第n - k小边。
平面欧几里德最小生成树是经典问题,可以做到O(nlogn)。具体做法是先对平面点进行三角剖分,时间复杂度是O(nlogn),三角剖分的边就是可能的在最小生成树的边。因为是平面图,所以有O(n)条边,在其上应用 Kruscal 算法即可。
阅读全文 - [计算几何]pku1673 摘要: 此问题可转化为求三角形垂心。我的做法是设垂心坐标为(x, y),然后利用垂直关系解方程。
阅读全文 - [计算几何]平面点的曼哈顿最小生成树 摘要: 平面点的曼哈顿最小生成树
阅读全文 - [计算几何]pku1624 摘要: 简单计算几何,我的做法是列出所有可能的切法(一共18种),求最优值。
阅读全文 - [计算几何]pku1408 摘要: 构造所有的线段,然后枚举每对水平-竖直线段,求交点,然后计算四边形面积,求最大值。
阅读全文 - [计算几何]pku3384 摘要: 强烈推荐此题。半平面交算法的一个应用。
具体做法是,把多边形的每条边向内平移r单位长度,用这些线段所在直线和原多边形作半平面交,得到的区域就是半径为r的圆放入多边形的可行域。可以证明这个区域一定是凸的,或者退化为一条线段,或一个点。那么,我们就可以在这个区域上求最远点对啦。
我的做法是O(n^2)的。应该存在O(nlogn)的做法,因为都是凸多边形,每次半平面交只有最多两个交点,可二分,而最后的求最远点对可以旋转卡壳。比赛的时候时间少,就写了个暴力O(n^2)的。
阅读全文 - [计算几何]pku1410 摘要: 基本几何题,判断线段是否与矩形相交。转化为线段在矩形内或线段与四条边相交。 唯一要注意的是题目中关于左上角和右下角的定义。
阅读全文 - [计算几何]pku1319 摘要: 这个题需要分情况讨论。如果是grid,就能直接算,如果是skew,就一层层往上模拟着堆。最后取最大值。
阅读全文 - [计算几何]两圆求交点 摘要: mmd 和 cz 的智慧结晶。某次比赛的时候写的。
阅读全文 - [计算几何]pku1586 摘要: 超级恶心的精度题。注意读清题意,然后直接做就行了。
阅读全文 - [计算几何]pku2954 摘要: Pick公式的应用。先介绍一下Pick公式: a = e / 2 + i - 1
a为多边形(顶点都在格点上)面积,e为多边形边上的格点数,i为多边形内部的格点数。
题目给出三点坐标,边上的格点数可用gcd求得,剩下的事就是解方程了。
阅读全文 - [计算几何]pku1569 摘要: 枚举三角形,然后判断是否其余的点都不在形内,也不在边上。时间复杂度是O(n^4)。
阅读全文 - [计算几何]pku3129 摘要: 很简单的几何题。直接硬搞即可。
阅读全文 - [计算几何]pku一些关于多边形的题目 摘要: 见内
阅读全文 - [计算几何]pku3130 摘要: 又是一个求多边形的核的题。
阅读全文 - [计算几何]pku2079 摘要: 先求凸包,然后再用旋转卡壳方法求解。 具体做法是枚举三角形的第一个点i,设j = i + 1,k = j + 1。然后做以下操作:
1.计算i,j,k构成的三角形面积a1和i,j,k + 1构成的三角形面积a2,如果a2 < a1,则进行下一步,否则k++,重复此步。
2.记录此时的三角形面积b,如果b < preb(就是上一个j对应的三角形面积)j++,转第一步,否则退出。
可以证明这个算法的复杂度为O(n2)。具体实现见代码。
阅读全文 - [计算几何]pku1494 摘要: 其实是初等几何题。在纸上画一下就出来了。
阅读全文 - [计算几何]pku1473 摘要: 很简单的题。直接按照题意模拟即可。
阅读全文 - [计算几何]pku1039 摘要: 具体算法在《算法艺术与信息学竞赛》里有讲。
阅读全文 - [计算几何]pku1133 摘要: 这个题目我用的是枚举。具体做法是,对于每个星座,把它的第1个点放在星图的第i个点上,第2个点放在星图的第j个点上(i != j),保持形状不变,移动这个星座中的其他点,看看这些点是否都和星图中的点重合。若满足条件,则找到一个匹配。如此得到星座c对星图的匹配数a。再得到星座c对它本身的匹配数b。那么星座c的出现次数就是 a / b。对于只有一个星星的星座,要特殊考虑一下。至于找出最亮星座,方法很简单:每次记录亮度值,发现更亮的就更新解。
p.s. 我一开始是用STL的complex做的,超时。后来改成向量做了。
阅读全文 - [计算几何]pku1092 摘要: 题目要求统计一个平面图中所有边数为k的面的个数。应该是个经典问题。说说我的算法吧。 枚举每条边,做以下的基本步骤。
基本步骤:以这条边作起始边,不断地找下一条“最左转”的边,并且标记每个点的访问次数,直到某个点第3次被访问为止。
经过这个步骤之后,得到一个顶点序列。容易知道,当且仅当这个顶点序列是2-重复(就是形如12341234这样),并且是逆时针旋转的,那么就是一个面。
接下去我们就把所有找到的边数为k面进行hash去重,就得到答案啦。 貌似我想的这个算法不够好,如果有更好的算法,欢迎和我讨论。
阅读全文 - [计算几何]pku1471 摘要: 这题勉强算几何吧。我写了个超级慢的枚举。
阅读全文 - [计算几何]pku1434 摘要: 简单几何题,但是容易WA。做法是二分水面高度,然后看看这个高度对应多少水。
阅读全文 - [计算几何]pku1389 摘要: 题目给出 n 个矩形,要求它们的面积并。具体做法是离散化。先把 2n 个 x 坐标排序去重,然后再把所有水平线段(要记录是矩形上边还是下边)按 y 坐标排序。最后对于每一小段区间 (x[i], x[i + 1]) 扫描所有的水平线段,求出这些水平线段在小区间内覆盖的面积。总的时间复杂度是 O(n^2)。利用线段树,可以优化到 O(nlogn)。
阅读全文 - [计算几何]pku1279 摘要: 求多边形的核。用半平面交算法。
阅读全文 - [计算几何]pku1418 摘要: 强烈推荐此题! 先考察一下这个问题的性质。 性质1:任何一个圆都覆盖了一个闭区域。
性质2:对于任意一个点,覆盖它的最上面的那个圆,一定是可见的。 性质3:如果一个圆不可见(它被完全覆盖),那么它的边界是被完全覆盖的。
性质4:n个圆最多有2(n-1)^2个交点,这些交点把n个圆分成最多2(n-1)^2条小圆弧。
性质5:对于每个小圆弧,要么它全被覆盖,要么它全不被覆盖。
根据性质1和性质2,问题转化为恰当地找出一些点,对于每个点,把覆盖它的最上面的圆标记为可见。 根据性质3,这些点一定在所有圆的边界集合内。
根据性质5,所有小圆弧构成边界集合。每个小圆弧上只要任意取一个点就能代表整个小圆弧(边界)。不妨取中点。
至此得到算法:取所有小圆弧的中点,对每个点找到覆盖它的最上面的圆。
根据性质4,最多取2(n-1)^2个点。对每个点找到覆盖它的最上面的圆,需要O(n)次运算。总复杂度是O(n^3)。
阅读全文 - [计算几何]pku1269 摘要: 很好的基础题,判断直线相交的情况。要注意精度。判断平行和重合时,用整数运算比较精确。剩下的事就是解出交点了。
阅读全文 - [计算几何]pku1118 摘要: 朴素做法是 O(n^3) 的,超时。我的做法是枚举每个点,然后求其它点和它连线的斜率,再排序。这样就得到经过该点的直线最多能经过几个点。求个最大值就行了。复杂度是 O(n^2logn) 的。把排序换成 hash,可以优化到 O(n^2)。
阅读全文 - [计算几何]pku2284 摘要: 应用平面图的欧拉定理:V + F - E = 2 两两线段求交,得到交点数 V,然后判断每个交点落在几条边上,如果一个点在一条边上,这条边就分裂成两条边,边数加 1。这样得到边数 E。最后直接用欧拉定理解得 F。
阅读全文 - [计算几何]pku1151 摘要: 题目给出 n 个矩形,要求它们的面积并。具体做法是离散化。先把 2n 个 x 坐标排序去重,然后再把所有水平线段(要记录是矩形上边还是下边)按 y 坐标排序。最后对于每一小段区间 (x[i], x[i + 1]) 扫描所有的水平线段,求出这些水平线段在小区间内覆盖的面积。总的时间复杂度是 O(n^2)。利用线段树,可以优化到 O(nlogn)。
阅读全文 - [计算几何]pku1113 摘要: 先求凸包,答案是凸包周长 + 2πl。因为简单多边形的转角是360度,所以加上一个圆的周长。
阅读全文 - [计算几何]pku1106 摘要: 简单题,直接模拟即可
阅读全文 - [计算几何]pku 部分计算几何题目列表 摘要: pku 部分计算几何题目列表
阅读全文 - [计算几何]pku3347 摘要: 先把矩形扩大 sqrt(2) 倍,转化为整点问题。然后逐个求出每个矩形的坐标。 对于每个矩形分别求出在它之上的矩形覆盖的区间大小 t1,和包括它本身以及在它之上的矩形覆盖的区间大小 t2 若 t1 == t2,则该矩形被遮盖。
阅读全文 - [计算几何]pku3334 摘要: 二分水面高度,然后求总水量(就是求多边形面积)
阅读全文 - [计算几何]pku3335 摘要: 求多边形的核
阅读全文 - [计算几何]pku1696 摘要: 先按题意找出最低点作为起始点,计算出起始向量。然后每次选择左转角度最小的点走。一定能走完 n 个点。
阅读全文 - [计算几何]pku1687 摘要: 题目要求从几个区域中,求出包含其它区域的那个区域。其实就是求最大区域。 只要对每个区域依次计算面积即可,然后取最大的那个。
阅读全文 - 凸包(类实现) 摘要: 凸包(类实现)
阅读全文 - [计算几何]pku1654 摘要: 记录当前点和前一个点的坐标,算叉积,然后加入总面积之中 注意最后得到的面积有可能是负的,要取绝对值,还有答案有可能超过 int 范围,要用 long long
阅读全文 - [计算几何]pku1556 摘要: 如果两点的连线不和墙相交,那么在图中为这两点连一条边,权值为这两点的距离 然后做 Dijkstra
阅读全文 - [计算几何]pku1375 摘要: 对每个圆作切线,求出投影区间,最后全部求并
阅读全文 - [计算几何]pku1031 摘要: 对多边形的每个边计算和原点的夹角范围,求并得到总夹角范围 alpha 答案就是 min(alpha, 2 * pi) * k * h
阅读全文 - [计算几何]pku1873 摘要: 暴力枚举砍掉的树,然后对剩余的树求凸包