1913: [Apio2010]signaling 信号覆盖
Time Limit: 20 Sec Memory Limit: 64 MB
Submit: 1502 Solved: 615
[Submit][Status][Discuss]
Description
Input
输入第一行包含一个正整数 n, 表示房子的总数。接下来有 n 行,分别表示
每一个房子的位置。对于 i = 1, 2, .., n, 第i 个房子的坐标用一对整数 xi和yi来表
示,中间用空格隔开。
Output
输出文件包含一个实数,表示平均有多少个房子被信号所覆盖,需保证输出
结果与精确值的绝对误差不超过0.01。
Sample Input
4
0 2
4 4
0 0
2 0
Sample Output
3.500
HINT
3.5, 3.50, 3.500, … 中的任何一个输出均为正确。此外,3.49, 3.51,
3.499999,…等也都是可被接受的输出。
【数据范围】
100%的数据保证,对于 i = 1, 2, .., n, 第 i 个房子的坐标(xi, yi)为整数且
–1,000,000 ≤ xi, yi ≤ 1,000,000. 任何三个房子不在同一条直线上,任何四个房子不
在同一个圆上;
40%的数据,n ≤ 100;
70%的数据,n ≤ 500;
100%的数据,3 ≤ n ≤ 1,500。
思路{
直接枚举方案计算明显不行.
不知怎么的就想到了用多边形的方法解决问题.
发现,一个凸多边形对ans的贡献为2(对角和>180的两个点),凹多边形贡献为1(覆盖凹进去的那个点).
那么问题转化为求凹多边形的个数.
我们枚举每一个点,计算以它为中心的凹多边形个数.
这个极角排序一下,每次找出以该点为中心的两条边夹角最大且<π,那么以下面的边上的点和这中间所有点组合都不会包括中心点,
用组合数减一下,求出凹多边形的个数,
再用组合数算出凸多边形的个数即可.
最后答案包括构成外接圆的3点,所以要加上3.
}