【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操作系统的编程语言. ①具备完善的面向对象特性: 封装:将现实世界中存在的某个客体的属性与行为绑定在一起,并放置在一个逻辑单元内 继 ...
随机推荐
- 软件缺陷5C标准
Correct(准确) :每个组成部分的描述准确,不会引起误解 Clear(清晰): 每个组成部分描述清晰,易于理解 Concise(简洁): 只包含必不可少的信息,不包括任何多余的内容 Comple ...
- 2019Java常见面试上
一.开场白简单的介绍一下自己的工作经历与职责,在校或者工作中主要的工作内容,主要负责的内容:(你的信息一清二白的写在简历上,能答出来的最好写在上面,模棱两可不是很清楚的最好不要写,否则会被问的很尴尬) ...
- 一篇学习完rabbitmq基础知识,springboot整合rabbitmq
一 rabbitmq 介绍 MQ全称为Message Queue,即消息队列, RabbitMQ是由erlang语言开发,基于AMQP(Advanced MessageQueue 高级消息队列协议 ...
- poj1155 TELE (树上分组背包)
题目链接:https://vjudge.net/problem/POJ-1155 题意:给定一颗以1为根的边权树,有n个结点,其中m个叶子结点,每个叶子结点有一个价值.要求从m个叶子结点中选最多的结点 ...
- PTA(Advanced Level)1075.PAT Judge
The ranklist of PAT is generated from the status list, which shows the scores of the submissions. Th ...
- mybatis 基础(一) xml配置
如果文章有误,请各位楼下评论,感谢各位积极修正! 一起学习,成为大佬! mybatis: 1.轻量级 2.高级映射(实体类与数据库表字段的映射) 这样就可以后续开发中去操作实体类而不需要去关注数据库, ...
- vue中关于checkbox数据绑定v-model指令说明
vue.js为开发者提供了很多便利的指令,其中v-model用于表单的数据绑定很常见, 下面是最常见的例子: <div id='myApp'> <input type="c ...
- Fiddler之常用操作(过滤器设置,代理设置,手机抓包设置,手机代理配置)
记录下,工作中常用的一些设置和操作~ 1.过滤“脏”请求 两个下拉框的名词解释: A.内外网过滤 No Zone Filter:不分区域过滤(内网外网都显示) Show only Intranet H ...
- 北电之死:谁谋杀了华为的对手?——银湖资本(Silver Lake)董事总经理爱德华·詹德出任CEO,既不了解华为,也不重视中国,直截了当地否决了收购华为
作者:戴老板:微信公众号:饭统戴老板(ID: worldofboss) 2003年5月,北京SARS疫情紧张,摩托罗拉集团总裁迈克·扎菲罗夫斯基(Mike Zafirovski)却准备不走寻常路,决定 ...
- 链表分割——牛客剑指offer
题目描述: 编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前 给定一个链表的头指针 ListNode pHead,请返回重新排列后的链表的头指针.注意:分割以后 ...