zoukankan      html  css  js  c++  java
  • LG3630 [APIO2010]信号覆盖(计算几何)

    LG3630 [APIO2010]信号覆盖

    前言

    南海都有网络了,怎么北京还要覆盖信号啊

    好久以前做的计算几何题了,回来复盘一下。

    解法

    首先,题目中各有一个条件很重要:

    保证任何三个房子都不在同一条直线 上,任何四个房子都不在同一个圆上。

    翻译一下,没有四点共圆,没有三点共线。

    我们做这道题依赖于这个条件。

    首先对于 (A,B,C) 三个点作的外接圆,一定覆盖这三个点,对于任何一个圆都是如此。那我们的答案可以表示为:

    [ans=frac{sum}{C_n^3}+3 ]

    其中,(C^3_n) 是圆的总数,而 (sum) 是所有圆圆内的点的数的总和。

    问题就转化为,如何求 (sum) 呢?

    正难则反。

    我们可以算每个点在多少个圆内部,对于第 (i) 个点,这个值我们记为 (f_i)。那么 (sum=sumlimits_{i=1}^n f_i)。这样,我们就要考虑确定圆的三个点和点 (i),也就是四个点。因此我们考虑这四个点组成的四边形。

    如果组成凸四边形。 则如下图:

    1

    由于没有四点共圆的情况,一定没有对角和为 (180) 的可能。那么以 (A,D,C) 作圆,一定能覆盖 (C),以 (D,C,B) 作圆,一定覆盖 (A)。所以一个凸四边形对 (sum)(2) 的贡献。

    如果组成凹四边形。 则如下图:

    2

    显然,只有以 (C,B,D) 作圆才能覆盖 另一个点 (A),因此一个凹四边形对 (sum) 的贡献是 (1)

    问题再次被我们转化,变为有多少个凸四边形,多少凹四边形。设他们的数量分别为 (x,y)。我们有:

    [x+y=C_n^4 ]

    我们到底是求 (x),还是求 (y) 呢?

    由于

    [sum=2x+y=C_n^4+x ]

    我们只需要求出凸多边形数量 (x) 即可。

    但是,真的是这样做吗?我们发现这样做其实很难。

    凹四边形的数量会比凸四边形数量好求得多。呵呵

    如果你仔细想想,就会发现,每个凹四边形都有一个凹角,所以我们要求出凹角数量。我们令凸角数量为 (a),凹角数量为 (b),由于每个四边形有四个角,我们有:

    [a+b=4cdot C_n^4 ]

    又到了熟悉的岔路口,但这一次,我们选择计算凸角数量 (a)

    这个求法非常简单,直接枚举每个点作为原点,其他的点做极角排序。

    3

    用双指针扫一下,得到以某一条边为定边的小于 (180) 度的角的个数。即 (i) 为定边,到 (j) 为止的角小于 (180) 度,(j+1)(i) 所夹的角大于 (180) 度。那么这个区间里面的凸角所属四边形有 (C_{j-i+1}^2) 个。

    注意要破环为链。

    这样我们就求得了 (a),我们就可以依次求出 (b,y,x,sum,ans)

    最后输出 (ans) 即可。

    最后时间复杂度为 (O(n^2log n))

  • 相关阅读:
    acm课程练习2--1002
    acm课程练习2--1001
    SDAU课程练习--problemQ(1016)
    SDAU课程练习--problemG(1006)
    SDAU课程练习--problemO(1014)
    SDAU课程练习--problemB(1001)
    SDAU课程练习--problemA(1000)
    SDAU课程练习--problemC
    SDAU课程练习--problemE
    不安全函数(转)
  • 原文地址:https://www.cnblogs.com/huayucaiji/p/LG3630.html
Copyright © 2011-2022 走看看