2011年省赛选拔之计算几何专题解题报告

2011年省赛选拔之计算几何专题-by zhendeluzi

A:Polylops

 

题目要求求一个简单多边形(不一定是凸包)的对称轴,我们的思想是枚举所有可能成为对称轴的直线,然后判断它是不是对称轴即可。

 

首先,显然朴素的判断直线是不是对称轴的时间复杂度是O(n)的――因为我们需要枚举所有的点判断它是否存在对称点。
然后,显然对称轴一定是某两点的连线的中垂线。但是暴力枚举所有的中垂线是O(n ^ 2)的,此时我们应当注意到,如果我们把这条中垂线竖直放置,那么它左右的点是对称的,同时最下面两点要么相邻,要么相隔一个点(相隔一个点的时候,相隔的那个点一定在这条中垂线上)。
于是对于每个点,我们只需要枚举两次――它右边的以及它右边的右边的,即可无遗漏的枚举所有的可能的对称轴。
于是我们枚举的复杂度就降为了O(n)。

 

然后的话,我们会发现实际上,每条对称轴恰好被枚举了两次――也就是垂直放置的时候最底下的两个点和最上面的两个点,分别将这条对称轴枚举出了一次――是的,可以由至多n / 2对点枚举出这条对称轴,但是这n / 2对点中有且恰好只有两对要么相邻要么相隔一个点。
所以我们的结果就是枚举出来的对称轴的条数除以2。

 

那么我们如何判断一条直线是不是对称轴呢?

 

假设这条对称轴是p、q的中垂线,如果p、q相隔一个点,就先判断那个点是不是在p、q的中垂线上,如果不是直接跳过。如果是的话,就开始枚举p、q上方的点来判断。
如果我们要判断x、y是否关于p、q的中垂线对称,那么首先我们应当注意到,x与p相隔的点的个数与y与q相隔的点的个数相同――也就是说我们从p、q开始,维护两个指针,分别向左、向右移动(注意移动过程是个环形的)。

 

然后判断x、y是否关于p、q的中垂线对称分两步。
1、如果(x, y)与(p, q)不平行,直接可以判出来不对称。
2、否则的话(x, p, q)与(y, q, p)构成的三角形应当是全等的――也就是说|(x, p)|(表示向量x->p的模)==|(y, q)| && |(x, q)| == |(y, p)|。

 

当然,2中的三角形可能退化,但是这并不会影响正确性。

 

判断x、y是否关于p、q对称显然是O(1)的。

 

因此这道题目可以在O(n) * O(n) = O(n ^ 2)的时间内出解。

 

B:Visible Lattice Points

 

这个题其实有那么点DP或者递推的意思。一个点被挡住的充要条件是这个点的x、y坐标互质。首先我们已知n = 1的时候结果是3,然后对于n = 2我们只要把n = 2相对于n = 1多出来的那2n个点判断一下他们的x、y坐标是否互质就可以算出来n = 2的解了,以此类推到n = 1000。
判断互质直接判最大公约数是否为1。

 

求最大公约数的时间复杂度为O(logn),最多有O(n ^ 2)个点,因此可以在O(n ^ 2 * logn)的时间内出解。

 

C:Geometric Shapes

 

这个题输入输出比较麻烦,其实很容易看出来题目里面所说的多边形相交的充要条件是有至少一组边相交,把所有的边全部互相判断是否相交即可。(a, b)与(c, d)相交的充要条件是a、b在(c, d)两端同时c、d在(a, b)两端――判断叉积符号是否相同即可。
设边数最多的两个多边形分别为a、b条边,则可以在O(a * b)的时间内出解。

 

D:Light Bulb

 

感觉是个积分题,不会做,不好乱说(每次写解题报告都有一道不会做= =)。

 

E:Intersecting Lines

 

判断直线是否相交。

 

如果两条线段平行,如果说直线a的一个点在直线b上,那么交集就是直线a(或者直线b,此时a == b);否则交集是空集。
否则的话利用公式计算出来交点。

 

这道题可以在O(1)的时间内出解。

 

F:Frame Polygonal Line

 

说是给出N个点求一个边与坐标轴平行的矩形包围住所有的点。

 

利用贪心思想可以发现,这个矩形最左边的垂直边的x = k中的k不能大于题给点中最小的x,同理可以得到最右边的垂直边不能小于最大的x,同理,最上的水平边的y = b中的b不能小于最大的y,最下的水平边不能大于最小的y。
所以这个矩形左下方的点是(min{x}, min{y}),右上方的点是(max{x}, max{y})

 

这道题可以在O(n)的时间内出解。

 

G:The Circumference of the Circle

 

给出了三个点a、b、c,那么圆心就位于(a, b)的中垂线与(b, c)的中垂线的交点处。
这儿计算一条线段的中垂线方法应该比较多,比如说构造出(a, b)的方向向量然后旋转90°然后给(a, b)中点m1加上这个方向向量得到m2,然后(m1, m2)就是(a, b)的中垂线。
然后求两条中垂线的交点即可得到圆心p。

 

半径r就是p到a的距离。

 

然后利用s = pi * r * r计算面积。

 

这道题可以在O(1)的时间内出解。


为解题报告打分
暂时不评分

★★
★★★
★★★★
★★★★★
发表您的评论(若贴AC代码或发表禁止言论等违禁行为将被删除并扣除积分)

|返回 |   | 转到页头|
Copyright @ 2008-2024(浙ICP备2022001332号), TZOJ. All Rights Reserved.