bzoj1913[Apio2010]signaling 信号覆盖 计算几何
1913: [Apio2010]signaling 信号覆盖
Time Limit: 20 Sec Memory Limit: 64 MB
Submit: 1583 Solved: 646
[Submit][Status][Discuss]
Description

Input
Output
Sample Input
0 2
4 4
0 0
2 0
Sample Output
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。
题意就是求任选三个点围成一个圆,圆内包含的点数的期望
可以由 sum/C(n,3) 得到,那么要求的就是sum即任选三个点构成圆包含点的个数的总和
暴力枚举肯定不行,。。
网上的题解说的是求凹凸四边形个数,开始不是很懂,后来莫名其妙懂了。
我的理解是:
对于任意的一个三点确定的圆,如果它其中包含了一些点,那么这三点和里面包含的任意一点可以构成四边形
如果是凹四边形,只可能由外边的三点形成圆包含它
如果是凸四边形,对于同一个四边形来说可能有两种形成圆的方式使得圆包含这四个点
所以寻找四边形个数就可以了,关键就是把每个四边形看成了三个点形成一个圆+一个点在圆内贡献的答案
凸四边形数s2不好处理,可以处理凹四边形s1的个数,s1+s2=C(n,4)可以算出s2
处理凹四边形,用四边形总数-凸的个数
枚举每一个点作为凹四边形里面的点,考虑另外三点:
如果要构成凹四边形,那么一定有两条边的角度大于180,枚举每一个点,找到它的下一个目标点(与他构成角大于180度)计算即可
#include<bits/stdc++.h>
#define ll long long
#define N 1505
using namespace std;
int n,tp;ll s1,s2;
struct P{
int x,y;double ang;
P operator - (const P &b)const{return (P){x-b.x,y-b.y};}
bool operator < (const P &b)const{return ang<b.ang;}
}a[N],q[N];
ll crs(P a,P b){return (ll)a.x*b.y-(ll)a.y*b.x;}
ll solve(int x){
tp=;
ll all=1ll*(n-)*(n-)*(n-)/;
for(int i=;i<=n;i++){
if(i==x)q[]=a[i];
else q[++tp]=a[i];
}
for(int i=;i<=tp;i++){
P tmp=q[i]-q[];
q[i].ang=atan2(tmp.y,tmp.x);
}
sort(q+,q++tp);
int p=,cnt=;
for(int i=;i<=tp;i++){
while(crs(q[i]-q[],q[p]-q[])>=){
p=p%tp+;cnt++;
if(p==i)break;
}
all-=cnt*(cnt-)/;cnt--;
}
return all;
}
int main(){
scanf("%d",&n);
if(n==){puts("3.00");return ;}
for(int i=;i<=n;i++)
scanf("%d%d",&a[i].x,&a[i].y);
for(int i=;i<=n;i++)s1+=solve(i);
s2=1ll*n*(n-)*(n-)*(n-)/-s1;
double ans=*s2+s1;ans/=1ll*n*(n-)*(n-)/;
printf("%.6lf",ans+);
return ;
}
bzoj1913[Apio2010]signaling 信号覆盖 计算几何的更多相关文章
- bzoj1913: [Apio2010]signaling 信号覆盖
传送门 题解传送门 //Achen #include<algorithm> #include<iostream> #include<cstring> #includ ...
- 【BZOJ-1913】signaling信号覆盖 极角排序 + 组合
1913: [Apio2010]signaling 信号覆盖 Time Limit: 20 Sec Memory Limit: 64 MBSubmit: 1232 Solved: 506[Subm ...
- 【bzoj1913】 Apio2010—signaling 信号覆盖
http://www.lydsy.com/JudgeOnline/problem.php?id=1913 (题目链接) 题意 给出一个平面上n个点,求任选3个点画一个圆所包含的点的期望值. Solut ...
- 【BZOJ】1913: [Apio2010]signaling 信号覆盖(计算几何+计数)
题目 传送门:QWQ 分析 人类智慧题,不会做...... 详细题解1 详细题解2 总体思路是考虑四边形 讨论凹四边形凸四边形,最后加一个单调性优化省掉个$ O(n) $ 代码 代码感觉好短 ...
- bzoj 1913: [Apio2010]signaling 信号覆盖【旋转卡壳(?)】
参考:https://blog.csdn.net/qpswwww/article/details/45334033 讲的很清楚 做法比较像旋转卡壳但是具体是不是我也不清楚.. 首先知道只要求出每种方案 ...
- [BZOJ1913][APIO2010]信号覆盖(计算几何+计数)
1913: [Apio2010]signaling 信号覆盖 Time Limit: 20 Sec Memory Limit: 64 MBSubmit: 1658 Solved: 672[Subm ...
- [BZOJ 1913] signaling 信号覆盖
Link:https://www.lydsy.com/JudgeOnline/problem.php?id=1913 TIP:(注意,这题只能输出6位才能过,7位都不行wtf?) Algorithm: ...
- [BZOJ1911][BZOJ1912][BZOJ1913]APIO2010解题报告
特别行动队 Description 这个好像斜率优化不是一般地明显了啊...只不过要分a的正负两种情况考虑是维护上凸还是下凸 /********************************** ...
- 家用wifi信号覆盖增强扩展实用指南
家用wifi信号覆盖增强扩展实用指南 现在网上很多号称穿墙王的无线路由器,但是一般用起来效果都不理想,其实最主要的原因还是家里面一般每个房间不大,但是墙比较多.并且一般也没有一个所谓的中心点放置路由器 ...
随机推荐
- Flask 扩展 缓存
如果同一个请求会被多次调用,每次调用都会消耗很多资源,并且每次返回的内容都相同,就该使用缓存了 自定义缓存装饰器 在使用Flask-Cache扩展实现缓存功能之前,我们先来自己写个视图缓存装饰器,方便 ...
- [Android]上传到多个Maven仓库的Gradle插件RapidMavenPushPlugin
博客搬迁至https://blog.wangjiegulu.com RSS订阅:https://blog.wangjiegulu.com/feed.xml RapidMavenPushPlugin 用 ...
- nodejs 全局变量
1.全局对象 所有模块都可以调用 1)global:表示Node所在的全局环境,类似于浏览器中的window对象. 2)process:指向Node内置的process模块,允许开发者与当前进程互动. ...
- 启动eclipse时出现“Failed to load the JNI shared library jvm.dll”错误及解决
昨晚安装另一个版本的eclipse,启动时出现了"Failed to load the JNI shared library jvm.dll"错误: 1.刚开始以为是因为当时没有将 ...
- zuul入门(4)zuul的注解@EnableZuulServer和@EnableZuulProxy
@EnableZuulServer.@EnableZuulProxy两个注解 @EnableZuulProxy简单理解为@EnableZuulServer的增强版,当Zuul与Eureka.Ribbo ...
- jsp连接书库DatabaseUtil类
public class DatabaseUtil { private static String driver = ConfigManager.getProperties("driver& ...
- python运算符重载(二)
一.基础知识 定义:当类中提供了某个特殊名称的方法,在该类的实例出现在它们相关的表达式时,Python自动调用它们 特性: 1.运算符重载让类拦截常规的Python运算. 2.类可重载所有Python ...
- 框架学习笔记之Mybatis(二)
一.动态sql 通过mybatis提供的标签,实现sql语句的拼接. 1.where <select id="findUserList" parameterType=&quo ...
- [Leetcode] 220. Contains Duplicate III
Given an array of integers, find out whether there are two distinct indices i and j in the array suc ...
- python自定义函数可以向前引用不用声明
#有些编程语言不够"聪明",向这类向前引用的方式会导致报错,但Python足够"醒目",这段代码是正确的! def next(): print('我在n ...