题意

给你一个\(w*h\)的方阵,不断在上面刷格子。每次等概率选择方阵中的两个点(可以相同)将以这两个点为端点的矩形(边平行于矩形边界)进行染色。共染\(k\)次,问最后被染色的格子的期望值。

题解

(参考了liu_runda大佬的博客

这真是一道好题~ 思维比较巧妙~

因为我们无法直接考虑每个点\(k\)次后被染色的期望(想一想,为什么)

正难则反,我们可以考虑\(k\)次后没被染色的期望,所以原来被染色的期望就可以转化为\(1-\)没有被染色的期望。

然后期望的线性性使得我们能够直接计算出每个点的答案。

我们先求它一次没有被染色的期望,在求它的\(k\)次方就行了。

我也不是直接求它没被染色的期望,而先求它被染色的期望,再用\(1-\)它就行了。

注意我这里化了两次,一次是求\(k\)次时,一次是求单次的时候,两次化的不同 也就是最后被染色的期望就是 \([1-(1-p)^k]\)


则先求它左上方选个点(要包括该点,后同)和右下方选点的方案数 加上 它右上方和左下方选点的方案数。

这个可以直接乘法原理算出来,但这个会算重复,可以画个图理解理解(我没画图,就调了贼久。。)

就是它所在的列和行的期望会算两遍,所以我们要减去这些贡献。然后中间的又少算了一遍,又要加上。

因为我们选择是有序的,但它选择是无序的,所以要乘上一个\(2\)。

但有一个特殊点我一直算错了,就是自己本身选两遍的方案不能乘\(2\),因为你本身考虑的就是无序的了。

然后用当前的方案数除以总方案数\((w*h)^2\)就可以得出它一次被染色期望了,然后瞎搞搞就行了。

我的代码应该是网上所见的最简洁的了QAQ

代码

/**************************************************************
Problem: 2969
Language: C++
Result: Accepted
Time:204 ms
Memory:1288 kb
****************************************************************/ #include <bits/stdc++.h>
#define For(i, l, r) for(register int i = (l), i##end = (int)(r); i <= i##end; ++i)
#define Fordown(i, r, l) for(register int i = (r), i##end = (int)(l); i >= i##end; --i)
#define Set(a, v) memset(a, v, sizeof(a))
using namespace std; inline bool chkmin(int &a, int b) {return b < a ? a = b, 1 : 0;}
inline bool chkmax(int &a, int b) {return b > a ? a = b, 1 : 0;} inline int read() {
int x = 0, fh = 1; char ch = getchar();
for (; !isdigit(ch); ch = getchar()) if (ch == '-') fh = -1;
for (; isdigit(ch); ch = getchar()) x = (x * 10) + (ch ^ 48);
return x * fh;
} void File() {
#ifdef zjp_shadow
freopen ("P2969.in", "r", stdin);
freopen ("P2969.out", "w", stdout);
#endif
} double Pow(double x, int power) {
double res = 1.0;
for (; power; power >>= 1, x *= x)
if (power & 1) res *= x;
return res;
} #define area(xl, yl, xr, yr) ((xr - xl + 1) * (yr - yl + 1))
int k, w, h;
double allprob, plan, expect = 0.0, now; int main () {
File();
cin >> k >> w >> h;
allprob = (double)(w * h) * (w * h);
For (i, 1, w)
For (j, 1, h) {
plan = 0;
plan += (double)area(1, 1, i, j) * area(i, j, w, h);
plan += (double)area(1, j, i, h) * area(i, 1, w, j); plan -= (double)i * (w - i + 1);
plan -= (double)j * (h - j + 1);
plan = plan * 2 + 1; now = 1.0 - Pow(1.0 - plan / allprob, k);
expect += now;
}
printf ("%.0lf\n", expect);
return 0;
}

BZOJ 2969: 矩形粉刷(期望)的更多相关文章

  1. bzoj 2969: 矩形粉刷 概率期望

    题目: 为了庆祝新的一年到来,小M决定要粉刷一个大木板.大木板实际上是一个W*H的方阵.小M得到了一个神奇的工具,这个工具只需要指定方阵中两个格子,就可以把这两格子为对角的,平行于木板边界的一个子矩形 ...

  2. bzoj 2969: 矩形粉刷 概率期望+快速幂

    还是老套路:期望图上的格子数=$\sum$ 每个格子被涂上的期望=$\sum$1-格子不被图上的概率 这样的话就相对好算了. 那么,对于 $(i,j)$ 来说,讨论一下上,下,左,右即可. 然后发现四 ...

  3. 【bzoj2969】矩形粉刷 期望

    题目描述 为了庆祝新的一年到来,小M决定要粉刷一个大木板.大木板实际上是一个W*H的方阵.小M得到了一个神奇的工具,这个工具只需要指定方阵中两个格子,就可以把这两格子为对角的,平行于木板边界的一个子矩 ...

  4. 【BZOJ2969】矩形粉刷 概率+容斥

    [BZOJ2969]矩形粉刷 Description 为了庆祝新的一年到来,小M决定要粉刷一个大木板.大木板实际上是一个W*H的方阵.小M得到了一个神奇的工具,这个工具只需要指定方阵中两个格子,就可以 ...

  5. bzoj2969 矩形粉刷 概率期望

    此题在bzoj是权限题,,,所以放另一个oj的链接 题解: 因为期望线性可加,所以可以对每个方格单独考虑贡献.每个方格的贡献就为至少被粉刷过一次的概率×1(每个格子的最大贡献就是1...)每个方格至少 ...

  6. BZOJ 2969 期望

    思路: 我们可以分开算每个格子自己的期望啊... 期望可以累加的 那就把这个大格子 分成 9个部分 分别算好了... //By SiriusRen #include <cmath> #in ...

  7. bzoj2969 矩形粉刷

    学习一波用markdown写题解的姿势QAQ 题意 给你一个w*h的矩形网格,每次随机选择两个点,将以这两个点为顶点的矩形内部的所有小正方形染黑,问染了k次之后期望有多少个黑色格子. 分析 一开始看错 ...

  8. Bzoj 3450: Tyvj1952 Easy (期望)

    Bzoj 3450: Tyvj1952 Easy 这里放上题面,毕竟是个权限题(洛谷貌似有题,忘记叫什么了) Time Limit: 10 Sec Memory Limit: 128 MB Submi ...

  9. Bzoj 4720 换教室 (期望DP)

    刚发现Bzoj有Noip的题目,只会换教室这道题..... Bzoj 题面:Bzoj 4720 Luogu题目:P1850 换教室 大概是期望DPNoip极其友好的一道题目,DP不怎么会的我想到了,大 ...

随机推荐

  1. Flink入门使用

    完全参考:Flink1.3QuickStart 启动本地运行 首先找一台安装了hadoop的linux. 将安装包解压,到bin目录启动local模式的脚本. tar -zxvf flink-1.3. ...

  2. LeetCode - 653. Two Sum IV - Input is a BST

    Given a Binary Search Tree and a target number, return true if there exist two elements in the BST s ...

  3. 常见HTTP状态码出现原因

    302:重定向.访问当前地址,后端重新指定一个URL,浏览器跳转到新的地址. 303:对于POST请求,它表示请求已被处理,客户端可以接着使用GET方法请求Location里的URL. 304:客户端 ...

  4. [SCOI2009][bzoj1025]游戏

    [SCOI2009][bzoj1025]游戏 标签: DP 置换 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1025 题解 很套路的题目 ...

  5. 利用while语句,条件为输入的字符不为'\n'.

    题目:输入一行字符,分别统计出其中英文字母.空格.数字和其它字符的个数. 1.程序分析:利用while语句,条件为输入的字符不为'\n'. 一个很简单的问题,其实换种方式就能完成,但是我就想怎么着才能 ...

  6. Appium基于Python unittest自动化测试 & 自动化测试框架 -- PO并生成html测试报告

    基于python单元测试框架unittest完成appium自动化测试,生成基于html可视化测试报告 代码示例: #利用unittest并生成测试报告 class Appium_test(unitt ...

  7. Java经典编程题50道之十七

    猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个:第二天早上又将剩下的桃子吃掉一半,而且又多吃了一个.以后每天早上都吃了前一天剩下的一半零一个.到第10天早上想再吃时,就只 ...

  8. 码农很忙代理IP系统V1.0版本上线

    码农很忙代理IP系统V1.0版本上线 经过为期一个月的重写和测试,新版本的码农很忙代理IP系统已于今日正式上线.新版本拥有更精准的匿名类型识别和更高效的验证调度算法. 新版本仍旧采用ASP.NET B ...

  9. django-表单

    一.从Request对象中获取信息 1.URL相关的信息 属性/方法 说明 举例 request.path 除域名以外的请求路径,以正斜杠开头 "/hello/" request. ...

  10. Python接口测试,Requests模块讲解:GET、POST、Cookies、Session等

    文章最下方有对应课程的视频链接哦^_^ 一.安装.GET,公共方法 二.POST 三.Cookies 四.Session 五.认证 六.超时配置.代理.事件钩子 七.错误异常