题意

  有一排高楼,每一栋高楼有一个正整数高度,高度为 \(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的更多相关文章

  1. 【codeforces 335E】 Counting Skyscrapers

    http://codeforces.com/problemset/problem/335/E (题目链接) 题意 懒得写了= = Solution 这题咋不上天= =. 参考题解:http://blo ...

  2. 【Codeforces 372A】Counting Kangaroos is Fun

    [链接] 我是链接,点我呀:) [题意] 如果a[i]*2<=a[j]那么i袋鼠可以装进j袋鼠里面 每只袋鼠都只能装一只袋鼠 [题解] 假设最后的方案是(ai,bi) 这里(ai,bi)表示下标 ...

  3. 【Leetcode 338】 Counting Bits

    问题描述:给出一个非负整数num,对[0, num]范围内每个数都计算它的二进制表示中1的个数 Example:For num = 5 you should return [0,1,1,2,1,2] ...

  4. HDU 5952 Counting Cliques 【DFS+剪枝】 (2016ACM/ICPC亚洲区沈阳站)

    Counting Cliques Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  5. 【BZOJ1630/2023】[Usaco2007 Demo]Ant Counting DP

    [BZOJ1630/2023][Usaco2007 Demo]Ant Counting 题意:T中蚂蚁,一共A只,同种蚂蚁认为是相同的,有一群蚂蚁要出行,个数不少于S,不大于B,求总方案数 题解:DP ...

  6. uoj #111. 【APIO2015】Jakarta Skyscrapers

    #111. [APIO2015]Jakarta Skyscrapers 印尼首都雅加达市有 NN 座摩天楼,它们排列成一条直线,我们从左到右依次将它们编号为 00 到 N−1N−1.除了这 NN 座摩 ...

  7. 【题解】Counting D-sets(容斥+欧拉定理)

    [题解]Counting D-sets(容斥+欧拉定理) 没时间写先咕咕咕. vjCodeChef - CNTDSETS 就是容斥,只是难了一二三四五\(\dots \inf\)点 题目大意: 给定你 ...

  8. 【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 ...

  9. OC学习心得【适合初学者】

    一.类和对象 1.OC语言是C语言的扩充,并且OC是iOS和OS X操作系统的编程语言. ①具备完善的面向对象特性: 封装:将现实世界中存在的某个客体的属性与行为绑定在一起,并放置在一个逻辑单元内 继 ...

随机推荐

  1. 安装horizon

    在控制节点上安装 controllerHost='controller' ADMIN_PASSWD='Ideal123!' 1.安装dashboard组件 yum -y install opensta ...

  2. OpenResty + Lua + Kafka 实现日志收集系统以及部署过程中遇到的坑

    ********************* 部署过程 ************************** 一:场景描述 对于线上大流量服务或者需要上报日志的nginx服务,每天会产生大量的日志,这些 ...

  3. vlan端口类型

    交换机三种链路类型:access.trunk.hybrid. access类型只属于一个VLAN,一般用于连接计算机端口. trunk类型可以允许多个vlan通过,可以接收和发送多个vlan的报文,一 ...

  4. iis实现方向代理

    将请求的网址重写重定向到其它网址.当80端口被占用无法同时使用两个Web服务的解决方案,使得IIS和Apache Tomcat 共存 0|1环境 WindowServer 2008 IIS7 Apac ...

  5. git回退

    以前,如果是要去除某一块功能,我都是选择性删除,选择性注释,然后前后逻辑各种查看,各种比较.每一次,改完这些我总感觉心好累啊!!!然后,我就发现了 Git 一个非常强大的功能:回滚.当然我还是喜欢叫它 ...

  6. WPF 异步加载窗体

    加载某个界面时,需要获取数据,而数据返回的时间比较长,这个时候可以异步加载界面. 1.在该窗体的加载事件(Load)中编写以下代码: new Thread(p=>{DataBinding();} ...

  7. docker-配置网桥-自定义网络

    容器网络访问原理 桥接宿主机网络 临时生效: # 网桥名称 br_name=br0 # 添加网桥 brctl addbr $br_name # 给网桥设置IP ip addr add 192.168 ...

  8. Qt Model/View理解(二)---构造model(细心研读,发现超简单,Model就是做三件事:返回行数量、列数量、data如何显示。然后把model与view联系起来即可,两个例子都是如此)good

    数据是一个集合,显示也是一个集合.例如一篇<西游记>的文章,所有的文字就是数据集合,展示方式就是显示的集合,可以以书本的形式,也可以以电纸书的形式,更可以用视频的方式展现. 下面是将一个二 ...

  9. 怎样在 js 中实现 反转字符串 的功能?

    "string".split('').reverse().join('');

  10. 怎样使用构造函数: Vue()?

    1. 新建一个 .html 文件 => 引入一个在线的 vue 库 => 写一个带 id 的 html 标签 => 写一个 script 标签, 这里的 vApp 是 Vue() 这 ...