【计算几何】信号覆盖

原创 2012年03月24日 19:09:34


调了很久很久。。。比较难。需要进行多次转换。


朴素O(n^4)过4组,但是因为我用getint,没法读负数,同时有个地方乘法写成加法,同时算半径算成了边长,所以零分。

比较有启发性,作为一道计算几何题目。本来是三角形和点的关系,可以转化成构造四边形。


在本题中,凹多边形和凸多边形是不同的,必须单独讨论,由图可知,凸多边形可以有两个圆满足这个要求,凹多边形只有一个。

设凸多边形和凹多边形个数分别是P、Q。



所以只需要求其一即可。此处求Q较容易。


我们枚举每一个点,求包含这个点的三角形的数量,累加即为Q。

再次转换,求包含某一点的所有圆的时候,我们求不包含这个点的所有圆,可以用叉乘来实现,当然需要极角排序(这里有一点要注意,因为用叉乘比较是相对的,而不是绝对的,考虑一些极角排序好了的向量,大小关系是循环的。。。因此排序貌似只能用快排,不能用堆排等,包括sort)

(对上面的讨论,有一点误区需要注意,不能直接根据不包含某点的所有三角形个数来求P,这一点想了很久才想清楚,因为一个四边形,枚举四个点的时候,这个四边形会被计算四次,所以除以要除以四)

就是不知为何,一开始记录x和y用long出错了,用double就对了。

#include <algorithm>
#include <cmath>
#include <cstdio>
using std::sort;

long long c[1600][10];

struct pos;
long crp(const pos& a,const pos& b);

struct pos
{
    double x;
    double y;
    bool operator<(const pos& p2) const
    {    
        return x*p2.y-p2.x*y < 0;
    }
};

long n;
pos a[3010];
pos b[3010];
long long X = 0;

inline void swap(pos& a,pos& b)
{
    pos t = a;
    a = b;
    b = t;
}
void Qsort(int l,int r)
{
 int i=l,j=r;
 pos mid=b[(l+l+r)/3];
 while (i<=j)
 {
  while ((b[i].x*mid.y-b[i].y*mid.x)<0)i++;
  while ((b[j].x*mid.y-b[j].y*mid.x)>0)j--;
  if(i<=j)swap(b[i++],b[j--]);
 }
 if(i<r)Qsort(i,r);
 if(l<j)Qsort(l,j);
}

inline void make(long l)
{
    for (long i=1;i<l;i++)
    {
        b[i].x = a[i].x - a[l].x;
        b[i].y = a[i].y - a[l].y;
    }
    for (long i=l+1;i<n+1;i++)
    {
        b[i-1].x = a[i].x-a[l].x;
        b[i-1].y = a[i].y-a[l].y;
    }
    #ifdef Debug
    for (long i=1;i<n;i++)
        printf("%lf%lf\n",b[i].x,b[i].y);
    #endif
    Qsort(1,n-1);
    for (long i=1;i<n;i++)///////////
    {
        b[i+n-1] = b[i];    ///////
    }
    for (long i=1,j=2;i<n;i++)
    {
        pos c;
        c.x = -b[i].x;
        c.y = -b[i].y;
        while (c.x*b[j].y-c.y*b[j].x > 0.0)
            j++;
        if (j-i-1 >= 2) X+=((j-i-1)*(j-i-2))>>1;
    }
}

inline long long C(long i,long j)
{
    if (c[i][j]) return c[i][j];
    if (i < j) return 0;
    if (j == 0 || i == j) return 1;
    return c[i][j] = C(i-1,j)+C(i-1,j-1);
}

inline void solve()
{
     for (long i=1;i<n+1;i++)
        make(i);
    long long ans = 2*C(n,4)+X-(long long)(n)*C(n-1,3);
    printf("%lf",double(ans)/double(C(n,3))+3.0);
}

inline int getint()
{
    int res = 0; char tmp; bool sgn = 1;
    do tmp = getchar();
    while (!isdigit(tmp) && tmp != '-');
    if (tmp == '-')
    {
        sgn = 0;
        tmp = getchar();
    }
    do res = (res << 1) + (res << 3) + tmp - '0';
    while (isdigit(tmp = getchar()));
    return sgn ? res : -res;
}

int main()
{
    freopen("signaling.in","r",stdin);
    freopen("signaling.out","w",stdout);
    scanf("%ld",&n);
    for (long i=1;i<n+1;i++)
    {
        scanf("%lf%lf",&a[i].x,&a[i].y);
    }
    solve();
    return 0;
}


☆【计算几何】信号覆盖

Description Input 输入第一行包含一个正整数 n, 表示房子的总数。接下来有 n 行,分别表示每一个房子的位置。对于 i = 1, 2, .., n, 第i 个房子的坐标用一对...
  • Whjpji
  • Whjpji
  • 2012年03月24日 08:52
  • 478

【BZOJ 1913】 [Apio2010]signaling 信号覆盖

计数问题+思路题~
  • Regina8023
  • Regina8023
  • 2015年05月07日 09:31
  • 1361

[BZOJ 1913][APIO 2011]信号覆盖(计算几何)

题目链接http://www.lydsy.com/JudgeOnline/problem.php?id=1913思路很容易发现,最终的答案为 每种方案在圆上和圆中的点的个数C3n(总方案数)\fra...
  • qpswwww
  • qpswwww
  • 2015年04月28日 11:55
  • 1007

[BZOJ1913][Apio2010]signaling 信号覆盖(计算几何+组合数学)

题目描述传送门题解非常神奇的一道思路题,刚开始只会sb暴力 这篇题解讲得非常好orz:http://blog.csdn.net/qpswwww/article/details/45334033代码#...
  • Clove_unique
  • Clove_unique
  • 2017年02月07日 19:04
  • 399

hdu 1077 Catching Fish 计算几何(圆覆盖)

题意: 给定n个点,现在要求找一个点
  • a601025382s
  • a601025382s
  • 2014年08月13日 12:42
  • 717

[BZOJ 1913][Apio2010]signaling 信号覆盖:计算几何

点击这里查看原题思维好题,具体还是看http://blog.csdn.net/qpswwww/article/details/45334033的吧/* User:Small Language:C++ ...
  • SmallSXJ
  • SmallSXJ
  • 2017年05月03日 15:30
  • 186

【BZOJ2823】【AHOI2012】信号塔 最小圆覆盖 计算几何

题解之前: 首先最小圆覆盖虽然有三层 forfor 循环,但是它是期望 O(n)O(n) 的。什么?你问我为啥?那我只能呵呵了,50W的 O(n3)O(n^3) 高速跑过。 后交的是不求凸包直...
  • Vmurder
  • Vmurder
  • 2015年06月23日 14:04
  • 1371

unix-关于信号、信号处理函数

信号是发生某件事时对进程的通知,它不可以被预知。信号可以来自其它进程或者进程本身,也可以是来自内核。每个信号都有一个处理办法(disposition),也称作与信号关联的行为(action),一般有三...
  • crfoxzl
  • crfoxzl
  • 2008年03月03日 16:34
  • 1588

基站覆盖范围,D2D通信,WIMAX和LTE的区别(初)

1.    不同基站(宏基站,微基站等)的覆盖范围?基站覆盖范围与什么有关?与发送功率的关系? (1)宏基站,微基站,微微基站 区别: 宏基站: 这是个网优参数。 跟用户密度有关。 一般做仿...
  • qq_18832565
  • qq_18832565
  • 2017年04月19日 21:24
  • 331

bzoj 1913: [Apio2010]signaling 信号覆盖

每个凸四边形对答案的贡献是2,每个凹四边形对答案的贡献是1. 凹四边形贡献1是显然的,凸四边形贡献是2的原因是: 如果一个点在一个三角形的外接圆内,那么α+β 现在考虑如何求凸四边形个数...
  • heheda_is_an_OIer
  • heheda_is_an_OIer
  • 2016年04月20日 15:04
  • 397
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【计算几何】信号覆盖
举报原因:
原因补充:

(最多只允许输入30个字)