codeforces 559D Randomizer
题意简述:
在一个格点图中 给定一个凸$n$边形(每个定点均在格点上),随机选择其中一些点构成一个子多边形,
求子多边形的内部点个数的期望。
----------------------------------------------------------------------------------------------------------------------------------
首先这题是需要知道 皮克定理 这个结论的
我们用 $s$代表多边形面积 $ans$代表内部点数(即要求的答案)$node$代表边上的格点
公式即为 $ans=s-\frac{node}{2}+1$
----------------------------------------------------------------------------------------------------------------------------------
然后这题是求期望的 对于期望 我们知道它是满足分配率的 于是我们可以考虑分别求出$s$和$node$的期望
对于$s$的期望 可以这样考虑(算贡献)
每次选出一个子多边形后 剩余部分显然是可以用多个顶点连续的多边形补成的
我们可以用前缀和维护这个顶点连续的多边形的面积 然后来算贡献
公式为$\displaystyle \frac{2^{n-i} -1}{2^n-1-n-C_2^n}*$子多边形面积
直接求出所有是$O(n^2)$的 然而观察公式我们可以发现i取较大的数的时候对答案的影响是很小的
综合考虑题目要求的$10^{-9}$的相对误差以及$double$的精度 $i$的上界$lim$可以取$min(n,60)$
$node$的求法也是类似的 只要熟悉如何算贡献就比较容易了 想了很久还不懂的话可以留言
----------------------------------------------------------------------------------------------------------------------------------
这样我们就可以过掉样例了 然后我们会$ WA 10$
因为$double$不仅仅是精度限制 还有范围限制 大概范围就是 $(10^{300}~10^{-300})$
这个问题 初次遇见还是很纠结的 多想想后 我们发现可以把公式变形成这样(上下同时除$2^n$):
$\displaystyle\frac{2^{-i} -1}{1-2^{-n}*(1+n+C_n^2)}*$子多边形面积
----------------------------------------------------------------------------------------------------------------------------------
差不多就是这些了 第一次写$div1D$题 还有些小激动呢
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=1e5+;
double polygon[N],p[N];
int x[N],y[N];
double s,ans,node,product;
int n,lim;
double cross(long long x1,long long y1,long long x2,long long y2)
{
return x1*y2-x2*y1;
}
int main()
{
scanf("%d",&n);
lim=min(n,);
p[]=;
for(int i=;i<n;++i)
{
scanf("%d%d",&x[i],&y[i]);
p[i+]=p[i]*0.5;
}
for(int i=;i<lim;++i)
{
product=(p[i]-p[n])/
(-p[n]*((long long)n*(n-)/+n+));
for(int j=;j<n;++j)
{
polygon[j]+=cross(x[(j+i-)%n]-x[j],y[(j+i-)%n]-y[j],
x[(j+i-)%n]-x[j],y[(j+i-)%n]-y[j]);
s-=product*polygon[j];
}
}
for(int i=;i<n-;++i)
s+=cross(x[i+]-x[],y[i+]-y[],
x[i+]-x[],y[i+]-y[]);
s/=;
for(int i=;i<=lim;++i)
{
product=(p[i]-p[n])/
(-p[n]*((long long)n*(n-)/+n+));
for(int j=;j<n;++j)
node+=product*__gcd(abs(x[(j+i-)%n]-x[j]),
abs(y[(j+i-)%n]-y[j]));
}
ans=s-node/+;
printf("%.10f\n",ans);
return ;
}
codeforces 559D Randomizer的更多相关文章
- python爬虫学习(5) —— 扒一下codeforces题面
上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...
- 【Codeforces 738D】Sea Battle(贪心)
http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...
- 【Codeforces 738C】Road to Cinema
http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...
- 【Codeforces 738A】Interview with Oleg
http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...
- CodeForces - 662A Gambling Nim
http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...
- CodeForces - 274B Zero Tree
http://codeforces.com/problemset/problem/274/B 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...
- CodeForces - 261B Maxim and Restaurant
http://codeforces.com/problemset/problem/261/B 题目大意:给定n个数a1-an(n<=50,ai<=50),随机打乱后,记Si=a1+a2+a ...
- CodeForces - 696B Puzzles
http://codeforces.com/problemset/problem/696/B 题目大意: 这是一颗有n个点的树,你从根开始游走,每当你第一次到达一个点时,把这个点的权记为(你已经到过不 ...
- CodeForces - 148D Bag of mice
http://codeforces.com/problemset/problem/148/D 题目大意: 原来袋子里有w只白鼠和b只黑鼠 龙和王妃轮流从袋子里抓老鼠.谁先抓到白色老鼠谁就赢. 王妃每次 ...
随机推荐
- 微信小程序这一块(续)
1.设置头部的信息 通过wx.setNavigationBarTitle 详情见:https://developers.weixin.qq.com/miniprogram/dev/api/ui/nav ...
- [Linux] 021 RPM 包的安装、升级与卸载
1. 包全名与包名包全名 包全名:操作的包是没有安装的软件包 使用包全名.而且要注意路径包名 包名:操作已经安装的软件包时,使用 是搜索 /var/lib/rpm/ 中的数 2. 安装 $ rpm - ...
- Python 学习笔记21 CMD执行测试用例
使用CMD命令执行测试用例 当我们在ride中设计好测试用例后,我们可以使用ride的界面工具来选择和运行测试用例. 系统也会提供比较好的报告和日志的浏览功能. 但是这样的自动化,毕竟是需要手工介入的 ...
- 【桶哥的问题——吃桶-简化版】【洛谷p2671】求和
求和=>[链接] 题目相较起_rqy出的要简单很多,来自noip普及组2015 化简这个式子:x+z=2y,故x与z mod 2同余,因此和桶哥的问题——吃桶一样的思路就可以做出来啦qwq: # ...
- sudo在清理内存的时候报错
运行下面语句清缓存时,报Permission denied错误:-bash: /proc/sys/vm/drop_caches: Permission denied sudo echo 1 > ...
- mysql 删除重复数据只保留一条记录
删除重复数据保留name中id最小的记录 delete from order_info where id not in (select id from (select min(id) as id fr ...
- JavaScript深入之词法作用域和动态作用域(转载)
作用域 作用域是指程序源代码中定义变量的区域. 作用域规定了如何查找变量,也就是确定当前执行代码对变量的访问权限. JavaScript 采用词法作用域(lexical scoping),也就是静态作 ...
- Git配置全局账号密码避免每次拉取、提交输入账号密码
前言 在大家使用github的过程中,一定会碰到这样一种情况,就是每次要push 和pull时总是要输入github的账号和密码,这样不仅浪费了大量的时间且降低了工作效率.在此背景下,本文在网上找了两 ...
- Solr的学习使用之(一)部署
Solr的主要功能是全文检索,该功能分为两个过程:创建索引和对索引进行搜索 一.心得体会 第一次写技术博客,这次写的基本上都是从网络上整理的来的,外加自己的一些实践,以后争取全部原创哈,都说写技术博客 ...
- linux系统部署war包,查看tomcat日志
1.部署war包app/tomcat/bin在tomcat/bin 目录下启动 .startup.sh,在启动过程中tomcat会对war包进行解压,形成相应的项目目录 执行命令:./startup. ...