zoukankan      html  css  js  c++  java
  • 【MtOI2019】小铃的烦恼

    题面

    https://www.luogu.org/problem/P5516?contestId=20135

    先说一下我在考场做的情况。

    首先,大体方向掌握的很好:只对指定的颜色分析由它“统一”的概率和它“统一”的期望次数。

    期望次数我是用矩阵快速幂逼近的。

    用游走的模型,每个点向左右两个点连边,终点只向自己连边。

    得到一个邻接矩阵$M$,初始时的一个列向量$P=[0,0,...,0,1,0,...,0]$,代表初始时每个点上的人数期望,因为总共只有$1$个人,所以期望即概率,也代表初始时这个人在每个点的概率。

    把这个列向量乘上邻接矩阵$M$视为一次变换,我们求的就是$sum_{i=1}^{INF}{(P_n[i]-P_n[i-1]) imes i}$,这个式子因为带了$i$,所以显然是不能用矩阵快速幂求的,

    我们把这个式子展开,即求$kP_n[k]-p_n[k-1]-p_n[k-2]...-p_n[1]$,这个式子我们就可以用快速幂求了,把向量加上一行,矩阵加上一列,代表当前$P_n[i]$的前缀和,这样就可以转移了。

    这样我们就把期望次数求出来了,复杂度$O(n^3logn)$,是一个超时的方法,但是注意到超的不是很严重,并且它的询问都是一样的,所以可以打表预处理,变成$O(1)$。(大雾)

    如果用极限的思想解决,或许可以做到$O(n^3)$,可以想到到最后$P[1]...P[n-1]$都是$0$,只有$P[n]$是$1$,但是我们加的那一列的答案就不好求了,上网搜查了矩阵求极限的方法,应该不属于$OI$的范畴了,所以就到这里了。

    由一个指定颜色“统一”的概率,我的想法是这样的,期望长度的倒数比即为概率之比,但是这个结论显然是错误的,我也不知道是跟哪个大佬学的。所以这道题就不好做了。。。。

    题解的思路解决下面两个问题的思路和我不同。

    概率部分,是一个简洁而优美的结论,$$p[i] = frac{i}{n}$$,题解上是这么说的,因为这次操作有${2i(n-i)} over {n(n-1)}$的概率使得$i$变化,有${i(n-i)} over {n(n-1)}$的概率使得$i-1$,有${i(n-i)} over {n(n-1)}$使得$i+1$,所以有$frac{2i(n-i)}{n(n-1)}p[i] = frac{i(n-i)}{n(n-1)}p[i-1]+frac{i(n-i)}{n(n-1)}p[i+1]$,化简得$p[i]=frac{1}{2}(p[i-1]+p[i+1])$,所以$p[i]$是等差数列。

    但是我有个地方不明白,为什么不是$p[i]=frac{i(n-i)}{n(n-1)} p[i-1]+frac{i(n-i)}{n(n-1)} p[i+1]+frac{n(n-1)-2i(n-i)}{n(n-1)}p[i]$呢?

    经过漫长的思考~~我好像明白了,概率的状态空间大概长成这么个样子:我们有一颗树,根节点是$i$,问这棵树上有多少个叶子,是由$i$长大变成$n$形成的。

    但是统计这个东西是没有意义的,因为肯定是无数个,总数也是无数个,这个对我们求答案是没有帮助的。

    应该统计这棵树上变成“n”的叶子和叶子的总数的比值是多少。

    明确一点,任意一个状态,经过无数次确定的操作之后,肯定会变成一个叶子。

    当前的节点相当于把叶子分成了三份,一份给$i+1$,叶子数占总叶子数的${i(n-i)} over {n(n-1)}$,一份给$i-1$,叶子数占总叶子数的${i(n-i)} over {n(n-1)}$,最后一份给$i$,叶子数占总叶子数的${n(n-1)-2i(n-i)} over {n(n-1)}$,其中,因为最后一份子树的比值,也是总子树的比值,所以再算加权平均的时候就可以去掉了。

    如果按我刚刚的式子,算出来的大概是所有的$i$状态的节点占总节点的个数,有点混乱,不是我想要的。

    突然发现可能用“叶子”这个词不太恰当,因为此“树”非彼“树”,应该换成确定的结果。

    再来算期望,期望也跟我算的不一样,我真是太弱了。。。。

    $f_i$表示一个当前有$i$个地方被涂上了颜色,如果它“统一”了,期望步数是多少。

    算期望步数,(写到这里我发现我上面逻辑错乱了,就是应该先概率再期望的,可能上面的都是错的啊,求别$D$我)首先要知道这个状态到达终点的概率,还是刚才那个模型,只有有用的叶子节点才会被统计到期望里,所以每个子树在分叉的时候要乘一个系数,在最后的叶子也要乘一个系数,所以,有$$
    left{egin{matrix}
    {f_i=a(f_{i-1}+1)+b(f_{i}+1)+c(f_{i+1}+1)} hfill \
    {a+b+c=1} hfill \
    {a:b:c=frac{i-1}{3i} frac{i(n-i)}{n(n-1)}:frac{i}{3i} frac{n(n-1)-2i(n-i)}{n(n-1)}:frac{i+1}{3i} frac{i(n-i)}{n(n-1)}} hfill
    end{matrix} ight.
    $$

    解得

    $$f_i=frac{n(n-1)}{2i(n-i)}+frac{i-1}{2i}f_{i-1}+frac{i+1}{2i}f_{i+1}$$

    最后所谓“线性高斯消元”就是先帮他消好,然后直接让他算就行了。(思维不能僵化啊)

    代码见题解
    https://qiuly.xyz/archives/72/

  • 相关阅读:
    vertical-align
    剑指offer刷题
    ES6 promise
    wangyi准备
    spring定时器
    xshell下linux常用操作
    HSSFWorkbook生成excel文件
    梳理并分解继承体系
    JSON格式数据转换
    部署项目
  • 原文地址:https://www.cnblogs.com/shxnb666/p/11406697.html
Copyright © 2011-2022 走看看