bzoj2969 矩形粉刷
学习一波用markdown写题解的姿势QAQ
题意
给你一个w*h的矩形网格,每次随机选择两个点,将以这两个点为顶点的矩形内部的所有小正方形染黑,问染了k次之后期望有多少个黑色格子.
分析
一开始看错题以为是求染黑所有格子的期望步数差点吓傻了...然后发现求的是染黑格子的期望个数,那么就可以无脑上期望的线性性了.
\(\text{某个格子对期望的贡献}\)
\(=\text{这个格子最后被染黑的概率}\)
\(=1-这个格子最后没被染黑的概率\)
\(=1-(染色一次时这个格子这个格子没有被染黑的概率)^k\)
那么单次染色无法染黑某个格子的概率只需要数一数总的选择方案数和包含这个格子的选择方案数即可.
注意包含这个格子的矩形和包含这个格子的选择方案不是一一对应的.
某个长宽均大于等于2的矩形对应4种选择的的方案
(可以选择左上-右下 或 左下-右上,每种选择方式又对应两种方案,因为选择的两个顶点是有顺序的,下面两种类似)
长宽有一个为1的矩形对应2种选择的方案
长宽均为1的矩形对应1种选择的方案
注意到关于矩形的中心点对称的位置算出来的结果是一样的,可以利用这个将复杂度降低到1/4,然而我还是比bz上的榜一慢三倍...榜一太神啦
#include<cstdio>
typedef long long ll;
typedef double ld;
ld qpow(ld a,int x){
ld ans=1;
for(;x;x>>=1,a=a*a){
if(x&1)ans=ans*a;
}
return ans;
}
int k,w,h;ll tot;
ld p(int x,int y){
long long sum=0;
int x1=x,x2=w-x+1,y1=y,y2=h-y+1;
sum=x1*1ll*y1*y2*x2*4-x1*x2*2-y1*y2*2+1;
//printf("%d %d %lld %lld\n",x,y,sum,tot);
return (tot-sum)/(ld)(tot);
}
int main(){
scanf("%d%d%d",&k,&w,&h);
ld ans=w*h;tot=w*1ll*w*1ll*h*1ll*h;
//printf("%.4f\n",(double)p(1,1));
int ww=w/2,hh=h/2;
for(int i=1;i<=ww;++i){
for(int j=1;j<=hh;++j){//printf("a%d %d\n",i,j);
ans-=qpow(p(i,j),k)*4;
}
}
if(h&1){
for(int i=1;i<=ww;++i){//printf("b%d %d\n",i,h/2+1);
ans-=qpow(p(i,h/2+1),k)*2;
}
}
if(w&1){
for(int j=1;j<=hh;++j){//printf("c%d %d\n",w/2+1,j);
ans-=qpow(p(w/2+1,j),k)*2;
}
}
if((h&1)&&(w&1)){//printf("d%d %d\n",w/2+1,h/2+1);
ans-=qpow(p(w/2+1,h/2+1),k);
}
printf("%.0f\n",(double)ans);
return 0;
}
bzoj2969 矩形粉刷的更多相关文章
- bzoj2969 矩形粉刷 概率期望
此题在bzoj是权限题,,,所以放另一个oj的链接 题解: 因为期望线性可加,所以可以对每个方格单独考虑贡献.每个方格的贡献就为至少被粉刷过一次的概率×1(每个格子的最大贡献就是1...)每个方格至少 ...
- bzoj2969矩形粉刷
题解: 和前面那个序列的几乎一样 容斥之后变成求不覆盖的 然后再像差分的矩形那样 由于是随便取的所以这里不用处理前缀和直接求也可以 代码: #include <bits/stdc++.h> ...
- 【BZOJ2969】矩形粉刷 概率+容斥
[BZOJ2969]矩形粉刷 Description 为了庆祝新的一年到来,小M决定要粉刷一个大木板.大木板实际上是一个W*H的方阵.小M得到了一个神奇的工具,这个工具只需要指定方阵中两个格子,就可以 ...
- 【bzoj2969】矩形粉刷 期望
题目描述 为了庆祝新的一年到来,小M决定要粉刷一个大木板.大木板实际上是一个W*H的方阵.小M得到了一个神奇的工具,这个工具只需要指定方阵中两个格子,就可以把这两格子为对角的,平行于木板边界的一个子矩 ...
- bzoj 2969: 矩形粉刷 概率期望
题目: 为了庆祝新的一年到来,小M决定要粉刷一个大木板.大木板实际上是一个W*H的方阵.小M得到了一个神奇的工具,这个工具只需要指定方阵中两个格子,就可以把这两格子为对角的,平行于木板边界的一个子矩形 ...
- BZOJ 2969: 矩形粉刷(期望)
BZOJ 2969: 矩形粉刷(期望) 题意: 给你一个\(w*h\)的方阵,不断在上面刷格子.每次等概率选择方阵中的两个点(可以相同)将以这两个点为端点的矩形(边平行于矩形边界)进行染色.共染\(k ...
- bzoj 2969: 矩形粉刷 概率期望+快速幂
还是老套路:期望图上的格子数=$\sum$ 每个格子被涂上的期望=$\sum$1-格子不被图上的概率 这样的话就相对好算了. 那么,对于 $(i,j)$ 来说,讨论一下上,下,左,右即可. 然后发现四 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- [BOT] 一种android中实现“圆角矩形”的方法
内容简介 文章介绍ImageView(方法也可以应用到其它View)圆角矩形(包括圆形)的一种实现方式,四个角可以分别指定为圆角.思路是利用"Xfermode + Path"来进行 ...
随机推荐
- typedef void(*Fun)(void);
typedef void(*Fun)(void); 函数类似于数组,函数名就是它的首地址: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ...
- PHP的 first day of 和 last day of
话不多说,先上代码(当前是2017年6月2日) echo date("Y-m-d", strtotime("2017-02 first day of")).'& ...
- backgroud背景色样式兼容ie8 rgba()用法
今天遇到了一个问题,要在一个页面中设置一个半透明的白色div.这个貌似不是难题,只需要给这个div设置如下的属性即可: background: rgba(255,255,255,.1);但是要兼容到i ...
- Array 数组的排序 sort
JavaScript实现多维数组.对象数组排序,其实用的就是原生的sort()方法,用于对数组的元素进行排序.sort() 方法用于对数组的元素进行排序.语法如下:arrayObject.sort(s ...
- 解决windows10和ubuntu16.04双系统下时间不对的问题
电脑安装完windows10与ubuntu16.04双系统后,Ubuntu的时间总会和Windows的时间相差8小时,原因在于windows认为BIOS时间是本地时间,Ubuntu认为BIOS时间是U ...
- js利用闭包封装自定义模块的几种方法
1.自定义模块: 具有特定功能的js文件 将所有的数据和功能都封装在一个函数的内部 只向外暴露一个包含有n个方法的对象或者函数 模块使用者只需要通过模块暴露的对象调用方法来实现相对应的功能 1.利用函 ...
- 1 Python数据类型--
常见的Python数据类型: (1)数值类型:就是平时处理的数字(整数.浮点数) (2)序列类型:有一系列的对象并排或者排列的情况.如字符串(str),列表(list),元组(tuple)等 (3)集 ...
- hihoCoder 1051 : 补提交卡 枚举
思路:预处理cnt(i)表示前i个数中有多少天需要补提交卡,枚举各个连续区间,区间[j, i]中需要补提交卡的天数是cnt(i) - cnt(j-1),判断m是否大于等于cnt(i) - cnt(j- ...
- 项目实战14—ELK 企业内部搜索引擎
一.els.elk 的介绍 1.els,elk els:ElasticSearch,Logstash,Kibana,Beats elk:ElasticSearch,Logstash,Kibana ① ...
- enable multi-tenancy on openstack pike
Multi-tenancy 是openstack ironic从Ocata版本开始支持的新特性,通过network-generic-switch插件控制交换机,Ironic可以实现在不同租户间机网络隔 ...