【CF335 E】Counting Skyscrapers
题意
有一排高楼,每一栋高楼有一个正整数高度,高度为 \(i\) 的概率为 \(2^{-i}\)。一栋楼的每层从下往上依次编号为 \(0,1,2,\cdots,i-1\)。
为了出题,大楼之间安装了溜索。在一栋楼的第 \(i\) 层和另一栋楼的第 \(i\) 层之间有一条溜索,当且仅当这两栋楼之间没有一栋大楼高度达到 \(i\) 层。
Alice 和 Bob 要数数有多少栋楼。
Alice 非常细心,她从最左侧的楼出发,计数器为 \(1\)。然后她向右移动,每经过一栋楼就将计数器 \(+1\)。
Bob 非常没耐心,他希望尽快数完。他从最左侧的楼出发,计数器为 \(1\)。他只使用溜索在大楼之间移动。Bob 会一直用最高的溜索向右移动,但由于恐高,他会忽略那些编号超过 \(h\) 的楼层。Bob 用溜索旅行跑得比香港记者还快,以至于他根本没法数清经过了多少栋楼,因此每经过一条溜索后只是将计数器 \(+2^i\),其中 \(i\) 是这条溜索所在楼层的编号。
举个例子。有 \(6\) 栋大楼,从左到右的高度分别是 \(1,4,3,4,1,2\),且 \(h=2\)。Alice 开始时计数器为 \(1\),并且将计数器加了五次 \(1\),得到的结果是 \(6\)。Bob 开始时计数器为 \(1\),然后他依次加上 \(1,4,4,2\),最终得到 \(12\)。注意,Bob 出于恐高忽略掉了最高的溜索。

当 Alice 和 Bob 到达最右端的大楼时,他们将各自的计数器拿出来比较。给出 Alice 或者 Bob 的计数器的值,你需要计算出另外一个人的计数器的期望值。
\(2\le n\le 30000,\space 0\le h\le 30\)
题解
二合一?
Bob
考虑一个子问题:\(Bob\) 每经过一条溜索,期望经过了多少栋楼。
设它的计数器累加了 \(2^h\),即溜索所在楼层的编号是 \(h\),高度是 \(h+1\)。那么中间那些楼的高度都必须 \(\le h\)。
设每一栋楼的高度\(\le h\) 的概率设为 \(sum\),题目说了高度为 \(i\) 的概率是 \(2^{-i}\),则 \[sum=\frac{1}{2}+\frac{1}{2^2}+\cdots+\frac{1}{2^n}=\frac{2^n-1}{2^n}=1-\frac{1}{2^i}\]
那么从一栋高度为 \(H\) 的楼的第 \(h\in [1,H]\) 层出发走溜索,期望经过的高楼数(不算出发时所在的那栋楼)就是 \[E=1\times P(中间没有小楼)\times P(最后一栋楼的高度\gt h)+2\times P(中间有一栋小楼)\times P(最后一栋楼的高度\gt h)\]
(\(P(x)\) 表示事件 \(x\) 发生的概率)
结合 \(sum\) 的定义可得 \[\begin{align} E&=1\times sum^0\times (1-sum)+2\times sum^1\times (1-sum)+\cdots+\infty\times sum^{\infty}\times (1-sum) \nonumber \\ &= (1\times sum^0+2\times sum^1+\cdots+\infty\times sum^{\infty}) (1-sum) \nonumber \end{align}\]
这是个等差乘等比,可以用套路简化:\[sum\times E = (1\times sum^1+2\times sum^2+\cdots) (1-sum)+\cdots\] \[E = (1\times sum^0+2\times sum^1+\cdots) (1-sum)+\cdots\]
下减上得 \[(1-sum)E = (sum^0+sum^1+sum^2+\cdots+sum^{\infty}) (1-sum)\]
约掉 \(1-sum\),观察中间那一坨等比数列。等比数列的求和公式是 \(\frac{a_1(1-q^n)}{1-q}\),因为 \(0\lt sum\lt 1\),所以 \(0\lt q\lt 1\)。那么当 \(n\to \infty\) 时,\(q^n\to 0\),然后这个东西就变成了 \(\frac{a_1}{1-q}\)。这就是喜闻乐见的无穷项等比数列的求和公式。
于是上式可以化成 \[E=1+\frac{sum}{1-sum}=\frac{1}{1-sum}\]
之前算过 \(sum=\frac{2^h-1}{2^h}\),所以 \(E=2^h\)。
所以 Bob 的计数器每累加 \(2^h\) 时,就期望经过了 \(2^h\) 栋楼。算上起点(即最左边的)那一栋楼,总高楼数的期望值就是 \(n\)。
所以输入 Bob 时,Alice 的计数器的期望值就是 \(n\)……
Alice
考虑一层一层地向上增加所有楼的高度,就是不断的用更高层的溜索去覆盖区间中低层的溜索。
因为我们每次都是走高度最高的溜索,那么我们从低到高枚举溜索的最大高度,计算该层所有溜索的贡献。
编号为 \(0\) 的层的答案显然是 \(n\)(所有楼至少都有 \(1\) 层,所以每相邻两栋楼之间都有一条溜索)。
假设我们加到编号为 \(i\) 的层,枚举溜索长度为 \(j\)。
这个溜索可能出现在 \(n-j\) 个位置,每个位置出现的条件:两端的楼高在 \([i+1,\infty]\),中间的楼高在 \([1,i]\)。
这就是之前算过的 \(sum\) 的定义,每个位置出现的概率为 \((1-\frac{1}{2^i})^{j-1}\times (\frac{1}{2^i})^2\)。
根据 Bob 部分的结论,一条新溜索的期望长度为 \(2^i\)。但一条新溜索覆盖了一些之前高度比它低的溜索,我们要从 \(2^i\) 中减去 \(2^{i-1} \times 两栋楼中间位于编号为 i-1 的层的溜索的期望数量 cnt\)。
中间一共有 \(j-1\) 栋楼,设中间每一栋楼高度为 \(i\) 的概率为 \(p\),因为 \(i-1\) 层溜索的数量 就是中间高度为 \(i\) 的楼数 \(+1\),所以 \(cnt = 1 + (j-1)\times p\)。
考虑如何计算 \(p\)。因为中间那些楼的高度一定在 \([1,i]\) 中,所以 \(p = \frac{高度为 i 的概率}{高度在 [1,i] 的概率} = \frac{\frac{1}{2^i}}{\frac{2^i-1}{2^i}} = \frac{1}{2^i-1}\)。
最后答案就是 \[ans = n + \sum\limits_{i=1}^h \sum\limits_{j=1}^n (n-j)\times (1-\frac{1}{2^i})^{j-1}\times (\frac{1}{2^i})^2\times (2^i - 2^{i-1}\times (1+(j-1)\times \frac{1}{2^i-1}))\]
复杂度 \(O(nm)\)。
scb 的 Alice 做法
他考场上切的 dp 做法,他无敌了Orz
【CF335 E】Counting Skyscrapers的更多相关文章
- 【codeforces 335E】 Counting Skyscrapers
http://codeforces.com/problemset/problem/335/E (题目链接) 题意 懒得写了= = Solution 这题咋不上天= =. 参考题解:http://blo ...
- 【Codeforces 372A】Counting Kangaroos is Fun
[链接] 我是链接,点我呀:) [题意] 如果a[i]*2<=a[j]那么i袋鼠可以装进j袋鼠里面 每只袋鼠都只能装一只袋鼠 [题解] 假设最后的方案是(ai,bi) 这里(ai,bi)表示下标 ...
- 【Leetcode 338】 Counting Bits
问题描述:给出一个非负整数num,对[0, num]范围内每个数都计算它的二进制表示中1的个数 Example:For num = 5 you should return [0,1,1,2,1,2] ...
- HDU 5952 Counting Cliques 【DFS+剪枝】 (2016ACM/ICPC亚洲区沈阳站)
Counting Cliques Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- 【BZOJ1630/2023】[Usaco2007 Demo]Ant Counting DP
[BZOJ1630/2023][Usaco2007 Demo]Ant Counting 题意:T中蚂蚁,一共A只,同种蚂蚁认为是相同的,有一群蚂蚁要出行,个数不少于S,不大于B,求总方案数 题解:DP ...
- uoj #111. 【APIO2015】Jakarta Skyscrapers
#111. [APIO2015]Jakarta Skyscrapers 印尼首都雅加达市有 NN 座摩天楼,它们排列成一条直线,我们从左到右依次将它们编号为 00 到 N−1N−1.除了这 NN 座摩 ...
- 【题解】Counting D-sets(容斥+欧拉定理)
[题解]Counting D-sets(容斥+欧拉定理) 没时间写先咕咕咕. vjCodeChef - CNTDSETS 就是容斥,只是难了一二三四五\(\dots \inf\)点 题目大意: 给定你 ...
- 【2017 Multi-University Training Contest - Team 4】Counting Divisors
[Link]:http://acm.hdu.edu.cn/showproblem.php?pid=6069 [Description] 定义d(i)为数字i的因子个数; 求∑rld(ik) 其中l,r ...
- OC学习心得【适合初学者】
一.类和对象 1.OC语言是C语言的扩充,并且OC是iOS和OS X操作系统的编程语言. ①具备完善的面向对象特性: 封装:将现实世界中存在的某个客体的属性与行为绑定在一起,并放置在一个逻辑单元内 继 ...
随机推荐
- 【POJ - 1970】The Game(dfs)
-->The Game 直接中文 Descriptions: 判断五子棋棋局是否有胜者,有的话输出胜者的棋子类型,并且输出五个棋子中最左上的棋子坐标:没有胜者输出0.棋盘是这样的,如图 Samp ...
- 【ARM-Linux开发】Linux环境下使用eclipse开发C++动态链接库程序
Linux环境下使用eclipse开发C++动态链接库程序 Linux中也有类似windows中DLL的变成方法,只不过名称不同而已.在Linux中,动态链接叫做Standard Object,生成的 ...
- windows 3种方式运行exe文件
1.双击文件运行 2.打开cmd,cd 到要运行的文件目录下,输入文件名或者文件名.exe 3.将文件目录配置到系统环境变量,按windws+R输入文件名或者文件名.exe
- Linux常用安装配置
一.创建.删除.分组 创建用户 命令:useradd 用户名 或 adduser 用户名 注意:只有root用户才能创建新用户 例如,创建一个名为zhangsan的用户 使用passwd命令为 ...
- 03 Python基础
1.输出和输入 (1)print打印 Python 提供print方法来打印信息 输入: print ("hello python") 调用print方法,用户双引号(" ...
- 有关java5以后的线程
创建线程的方式 方式一 继承于Thread类 /** * 多线程的创建,方式一:继承于Thread类 * 1. 创建一个继承于Thread类的子类 * 2. 重写Thread类的run() --> ...
- http请求之of_ordering_http_get
//Public function of_ordering_http_get (string as_url) returns string //string as_urllong ll_tempstr ...
- 使用logstash从Kafka中拉取数据并传输给elasticsearch且创建相应索引的操作
注意事项:默认Kafka传递给elastci的数据是在'data'字段,且不包含其他数据,所以需要使用额外的操作进行处理 logstash配置文件操作 input { kafka { bootstra ...
- application.properties参数详解
# ----------------------------------------# CORE PROPERTIES# --------------------------------------- ...
- 向PHP发送HTTP-Post请求
欢迎访问我的个人博客,获取更多有用的东西 链接一 链接二 也可以关注我的微信订阅号:CN丶Moti 1.post.html <!DOCTYPE html> <html lang=&q ...