zoukankan      html  css  js  c++  java
  • 【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 的计数器的值,你需要计算出另外一个人的计数器的期望值。
      (2le nle 30000,space 0le hle 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) 的楼的第 (hin [1,H]) 层出发走溜索,期望经过的高楼数(不算出发时所在的那栋楼)就是 $$E=1 imes P(中间没有小楼) imes P(最后一栋楼的高度gt h)+2 imes P(中间有一栋小楼) imes P(最后一栋楼的高度gt h)$$
      ((P(x)) 表示事件 (x) 发生的概率)
      结合 (sum) 的定义可得 $$egin{align} E&=1 imes sum^0 imes (1-sum)+2 imes sum^1 imes (1-sum)+cdots+infty imes sum^{infty} imes (1-sum) onumber &= (1 imes sum^0+2 imes sum^1+cdots+infty imes sum^{infty}) (1-sum) onumber end{align}$$
      这是个等差乘等比,可以用套路简化:$$sum imes E = (1 imes sum^1+2 imes sum^2+cdots) (1-sum)+cdots$$ $$E = (1 imes sum^0+2 imes 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}),因为 (0lt sumlt 1),所以 (0lt qlt 1)。那么当 (n o infty) 时,(q^n o 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} imes (frac{1}{2^i})^2)

      根据 Bob 部分的结论,一条新溜索的期望长度为 (2^i)。但一条新溜索覆盖了一些之前高度比它低的溜索,我们要从 (2^i) 中减去 (2^{i-1} imes 两栋楼中间位于编号为 i-1 的层的溜索的期望数量 cnt)
      中间一共有 (j-1) 栋楼,设中间每一栋楼高度为 (i) 的概率为 (p),因为 (i-1) 层溜索的数量 就是中间高度为 (i) 的楼数 (+1),所以 (cnt = 1 + (j-1) imes 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 + sumlimits_{i=1}^h sumlimits_{j=1}^n (n-j) imes (1-frac{1}{2^i})^{j-1} imes (frac{1}{2^i})^2 imes (2^i - 2^{i-1} imes (1+(j-1) imes frac{1}{2^i-1}))$$
      复杂度 (O(nm))

    scb 的 Alice 做法

      他考场上切的 dp 做法,他无敌了Orz

  • 相关阅读:
    Spoj 2798 Qtree3
    [HAOI2015]树上操作
    Grass Planting
    [ZJOI2008] 树的统计Count
    Spoj375 Qtree--树链剖分
    [HNOI2012]永无乡
    雨天的尾巴
    temp
    线段树动态开点之逆序对
    线段树动态开点
  • 原文地址:https://www.cnblogs.com/scx2015noip-as-php/p/cf335e.html
Copyright © 2011-2022 走看看