【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 出于恐高忽略掉了最高的溜索。
  【CF335 E】Counting Skyscrapers_第1张图片
  当 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

转载于:https://www.cnblogs.com/scx2015noip-as-php/p/cf335e.html

你可能感兴趣的:(【CF335 E】Counting Skyscrapers)