msgbartop
My technology blog
msgbarbottom

01 May 10 HDOJ Monthly Contest – 2010.05.01 Line belt

这题是我最早想给HDOJ月赛的,现在借lxh达到了这个目的-.-!

http://acm.hdu.edu.cn/vip/contest_showproblem.php?pid=1004&cid=289

没啥特别意思的几何题。。做法就是双重三分,也就是三分里面套一个三分。

放在这里记录一下我的出题成果:) (more…)

Tags: , ,

18 Apr 10 武汉大学第八届程序设计竞赛部分决赛题目分析

在这里简单说一些我出的题目。

F: Pie

此题很明显的是一个最小匹配的模型。而后根据题目数据的特点可以利用DP来解决。

简单说一下性质:

1. 排序之后的匹配是不存在交叉线的。也就是说,如果第i高的男的和第j高的女的匹配,那么比i矮的男的就不能和比j高的女的匹配。同理,比i高的男的也就不能和比j矮的女的匹配。

2. 题目里有说男女的人数相差不到100,所以我们可以知道一个人的的可选匹配数量最多是100个。再加上这个性质,我们就可以用O(n * 100) = O(1000000)的DP来解决这个问题。相关的实现要用到滚存。

附上代码: (more…)

Tags: , , , ,

05 Apr 10 HDOJ Monthly Contest – 2010.04.04 Problem 1003 Point

http://acm.hdu.edu.cn/vip/contest_showproblem.php?pid=1003&cid=276

题目大意就是用下面的距离定义来求每一个点的最近点对。

Distance (A, B) = max (|Ax – Bx|, |Ay – By|)

这题是我最初给我们学校去年的区域赛准备的题目。说一下做法: (more…)

Tags: , ,

05 Apr 10 WHU2010校赛预赛J题:Guard

http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1010&cid=288

题意:给定一个简单多边形,问内部哪个点可以看到的面积最大。(可视范围是已知的R,也就是说,如果没有遮挡,那个可视面积就是一个半径为R的圆)

这题是我出的另一个复杂几何,说一下做法: (more…)

Tags: ,

07 Feb 10 POJ Monthly Contest – 2010.1.24 – Problem A "Cake"

http://poj.grids.cn/contest/1774/problem-A/

这个题目是我出的,题意写的有点晦涩-.-!

不过简单表述起来还是挺简单的。

就是在一个圆上进行切割,每一次切割都要跨过整个圆。然后需要检查切割线,检查切割线的方法就是碰触切割出来的每一个小块。

说白了就是小块为点,相邻的小块连边,然后问进行点涂色,使得每一个边的两个端点至少有一个是涂色过了的。

解法:

通过一系列比较麻烦的几何处理之后,所求出来的图是一个二分图。然后求得二分匹配就是答案。

关于这个图是二分图的证明也有比较形象的理解,就是这个图是明显没有奇环的,所以就是二分图咯。。。

Tags: , ,

07 Feb 10 圆的面积并

摘要

设想生活中往往需要知道很多图形的面积,但是当图形有多个的情况下,我们怎么知道这些图形的面积的并集呢? 现实中的图形往往可以转化成一些多边形和圆的组合. 本文介绍了一个O(n^2logn)求圆的面积并的算法. 并将其拓展,使其可以求得复杂现实图形的并集.与经典的扫描线相比,本文介绍的方法效率高,占用空间少,容易实现及拓展,而且几乎没有难以处理的几何特殊情况. (more…)

Tags: ,

07 Feb 10 计算几何之向量的旋转

矩阵真的好优美,好多在数学中那些乘乘加加的操作,其本质都是矩阵。这些操作,往往都是把事物进行分解,对每一个基量进行操作,最后再把这些操作整合起来。

向量旋转,这个几何中的基本操作,可以相当优美的用矩阵来操作。究其原因,也是因为向量是多维的。用矩阵来操作,正是把向量分解开来,分别旋转,最后再进行整合。

看下面的矩阵

clip_image002[4]

这个是二维向量的旋转矩阵,它可以将一个向量逆时针旋转一个角度。

将其变形,变会得到二维向量的顺时针旋转的形式:

clip_image002[16]

这里要注意一种特殊的情况,就是当角度为90度的时候,sin和cos的结果只有1, 0, -1三种可能性。所以这个矩阵可以改写成特殊的形式,其意义在于用这样的旋转操作,不会产生精度问题。sin和cos的运算的精度是比较低的,能少用则尽量少用。在计算几何中的向量旋转操作,大部分都可以通过变形,只用到旋转90度,从而避免精度问题。

再来说一点就是,这些旋转矩阵都有一些特点,最明显的莫过于他们的行列式的值都是1。所以在验证正确性的时候,可以用这个操作。也正因为有这一个性质,所以向量才只会进行旋转,不会进行缩放。

 

三维向量的旋转矩阵:

clip_image002[30]

clip_image002[32]

clip_image002[34]

 

上面三个公式的旋转方向可以看成按右手定则。

来看第三个公式,这个公式是围绕Z轴,把X轴往Y轴方向移动。我们把拇指向上(表示Z轴),手指指向X轴,然后手指自然弯曲方向便是旋转方向。

其它两个公式也是类似。

其实第三个公式,去掉Z轴,就是开头讲的逆时针旋转的公式。

在其它方向上的旋转都可以由这三个矩阵组合而来。

围绕轴u = (ux, uy, uz)来旋转的矩阵代码如下:

  1. double a[3][3] = {
  2.         {SQR(ux) + (1 – SQR(ux)) * c, ux * uy * (1 – c) – uz * s, ux * uz * (1 – c) + uy * s},
  3.         {ux * uy * (1 – c) + uz * s, SQR(uy) + (1 – SQR(uy)) * c, uy * uz * (1 – c) – ux * s},
  4.         {ux * uz * (1 – c) – uy * s, uy * uz * (1 – c) + ux * s, SQR(uz) + (1 – SQR(uz)) * c}
  5.     };

要注意这个ux * ux + uy * uy + uz * uz = 1

 

有一个比较有意思的问题就是,知道旋转矩阵之后,怎么来确定向量u呢?

我们做如下变形之后,可以得到:

Ru = Iu –> (R – I)u = 0

也就是说我们要找到一个非0的向量,使得他和一个矩阵乘起来得到一个空矩阵。这个问题可以用高斯消元来解决。实际上我们就是要解一个线性方程组。

本来想写更多东西的,可惜我的数学能力实在有限,很多东西自己都没有理解。等以后有机会了,再来补充此文吧。

Tags: