这题是我最早想给HDOJ月赛的,现在借lxh达到了这个目的-.-!
http://acm.hdu.edu.cn/vip/contest_showproblem.php?pid=1004&cid=289
没啥特别意思的几何题。。做法就是双重三分,也就是三分里面套一个三分。
放在这里记录一下我的出题成果:) (more…)
Tags: HDOJ Monthly, 三分, 计算几何
在这里简单说一些我出的题目。
F: Pie
此题很明显的是一个最小匹配的模型。而后根据题目数据的特点可以利用DP来解决。
简单说一下性质:
1. 排序之后的匹配是不存在交叉线的。也就是说,如果第i高的男的和第j高的女的匹配,那么比i矮的男的就不能和比j高的女的匹配。同理,比i高的男的也就不能和比j矮的女的匹配。
2. 题目里有说男女的人数相差不到100,所以我们可以知道一个人的的可选匹配数量最多是100个。再加上这个性质,我们就可以用O(n * 100) = O(1000000)的DP来解决这个问题。相关的实现要用到滚存。
附上代码: (more…)
Tags: WHU2010校赛决赛, 动态规划, 匹配, 图论, 计算几何
http://acm.hdu.edu.cn/vip/contest_showproblem.php?pid=1003&cid=276
题目大意就是用下面的距离定义来求每一个点的最近点对。
Distance (A, B) = max (|Ax – Bx|, |Ay – By|)
这题是我最初给我们学校去年的区域赛准备的题目。说一下做法: (more…)
Tags: HDOJ Monthly, 二维线段树, 计算几何
http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1010&cid=288
题意:给定一个简单多边形,问内部哪个点可以看到的面积最大。(可视范围是已知的R,也就是说,如果没有遮挡,那个可视面积就是一个半径为R的圆)
这题是我出的另一个复杂几何,说一下做法: (more…)
Tags: WHU2010校赛预赛, 计算几何
http://poj.grids.cn/contest/1774/problem-A/
这个题目是我出的,题意写的有点晦涩-.-!
不过简单表述起来还是挺简单的。
就是在一个圆上进行切割,每一次切割都要跨过整个圆。然后需要检查切割线,检查切割线的方法就是碰触切割出来的每一个小块。
说白了就是小块为点,相邻的小块连边,然后问进行点涂色,使得每一个边的两个端点至少有一个是涂色过了的。
解法:
通过一系列比较麻烦的几何处理之后,所求出来的图是一个二分图。然后求得二分匹配就是答案。
关于这个图是二分图的证明也有比较形象的理解,就是这个图是明显没有奇环的,所以就是二分图咯。。。
Tags: Poj Monthly, 图论, 计算几何
设想生活中往往需要知道很多图形的面积,但是当图形有多个的情况下,我们怎么知道这些图形的面积的并集呢? 现实中的图形往往可以转化成一些多边形和圆的组合. 本文介绍了一个O(n^2logn)求圆的面积并的算法. 并将其拓展,使其可以求得复杂现实图形的并集.与经典的扫描线相比,本文介绍的方法效率高,占用空间少,容易实现及拓展,而且几乎没有难以处理的几何特殊情况. (more…)
矩阵真的好优美,好多在数学中那些乘乘加加的操作,其本质都是矩阵。这些操作,往往都是把事物进行分解,对每一个基量进行操作,最后再把这些操作整合起来。
向量旋转,这个几何中的基本操作,可以相当优美的用矩阵来操作。究其原因,也是因为向量是多维的。用矩阵来操作,正是把向量分解开来,分别旋转,最后再进行整合。
看下面的矩阵
这个是二维向量的旋转矩阵,它可以将一个向量逆时针旋转一个角度。
将其变形,变会得到二维向量的顺时针旋转的形式:
这里要注意一种特殊的情况,就是当角度为90度的时候,sin和cos的结果只有1, 0, -1三种可能性。所以这个矩阵可以改写成特殊的形式,其意义在于用这样的旋转操作,不会产生精度问题。sin和cos的运算的精度是比较低的,能少用则尽量少用。在计算几何中的向量旋转操作,大部分都可以通过变形,只用到旋转90度,从而避免精度问题。
再来说一点就是,这些旋转矩阵都有一些特点,最明显的莫过于他们的行列式的值都是1。所以在验证正确性的时候,可以用这个操作。也正因为有这一个性质,所以向量才只会进行旋转,不会进行缩放。
三维向量的旋转矩阵:
上面三个公式的旋转方向可以看成按右手定则。
来看第三个公式,这个公式是围绕Z轴,把X轴往Y轴方向移动。我们把拇指向上(表示Z轴),手指指向X轴,然后手指自然弯曲方向便是旋转方向。
其它两个公式也是类似。
其实第三个公式,去掉Z轴,就是开头讲的逆时针旋转的公式。
在其它方向上的旋转都可以由这三个矩阵组合而来。
围绕轴u = (ux, uy, uz)来旋转的矩阵代码如下:
要注意这个ux * ux + uy * uy + uz * uz = 1
有一个比较有意思的问题就是,知道旋转矩阵之后,怎么来确定向量u呢?
我们做如下变形之后,可以得到:
Ru = Iu –> (R – I)u = 0
也就是说我们要找到一个非0的向量,使得他和一个矩阵乘起来得到一个空矩阵。这个问题可以用高斯消元来解决。实际上我们就是要解一个线性方程组。
本来想写更多东西的,可惜我的数学能力实在有限,很多东西自己都没有理解。等以后有机会了,再来补充此文吧。
Tags: 计算几何