题意

  有一排高楼,每一栋高楼有一个正整数高度,高度为 \(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. 软件缺陷5C标准

    Correct(准确) :每个组成部分的描述准确,不会引起误解 Clear(清晰): 每个组成部分描述清晰,易于理解 Concise(简洁): 只包含必不可少的信息,不包括任何多余的内容 Comple ...

  2. 2019Java常见面试上

    一.开场白简单的介绍一下自己的工作经历与职责,在校或者工作中主要的工作内容,主要负责的内容:(你的信息一清二白的写在简历上,能答出来的最好写在上面,模棱两可不是很清楚的最好不要写,否则会被问的很尴尬) ...

  3. 一篇学习完rabbitmq基础知识,springboot整合rabbitmq

    一   rabbitmq 介绍 MQ全称为Message Queue,即消息队列, RabbitMQ是由erlang语言开发,基于AMQP(Advanced MessageQueue 高级消息队列协议 ...

  4. poj1155 TELE (树上分组背包)

    题目链接:https://vjudge.net/problem/POJ-1155 题意:给定一颗以1为根的边权树,有n个结点,其中m个叶子结点,每个叶子结点有一个价值.要求从m个叶子结点中选最多的结点 ...

  5. PTA(Advanced Level)1075.PAT Judge

    The ranklist of PAT is generated from the status list, which shows the scores of the submissions. Th ...

  6. mybatis 基础(一) xml配置

    如果文章有误,请各位楼下评论,感谢各位积极修正! 一起学习,成为大佬! mybatis: 1.轻量级 2.高级映射(实体类与数据库表字段的映射) 这样就可以后续开发中去操作实体类而不需要去关注数据库, ...

  7. vue中关于checkbox数据绑定v-model指令说明

    vue.js为开发者提供了很多便利的指令,其中v-model用于表单的数据绑定很常见, 下面是最常见的例子: <div id='myApp'> <input type="c ...

  8. Fiddler之常用操作(过滤器设置,代理设置,手机抓包设置,手机代理配置)

    记录下,工作中常用的一些设置和操作~ 1.过滤“脏”请求 两个下拉框的名词解释: A.内外网过滤 No Zone Filter:不分区域过滤(内网外网都显示) Show only Intranet H ...

  9. 北电之死:谁谋杀了华为的对手?——银湖资本(Silver Lake)董事总经理爱德华·詹德出任CEO,既不了解华为,也不重视中国,直截了当地否决了收购华为

    作者:戴老板:微信公众号:饭统戴老板(ID: worldofboss) 2003年5月,北京SARS疫情紧张,摩托罗拉集团总裁迈克·扎菲罗夫斯基(Mike Zafirovski)却准备不走寻常路,决定 ...

  10. 链表分割——牛客剑指offer

    题目描述: 编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前 给定一个链表的头指针 ListNode pHead,请返回重新排列后的链表的头指针.注意:分割以后 ...