zoukankan      html  css  js  c++  java
  • 「考试」糊涂图

    不知道为啥达哥说简单。。。。。。

    考场上打了俩小时啥也没写出来导致崩盘了。

    但是真的是好题啊。

    要求在$NIM DAG$上随意加一条边,这条边只能走一次,求$Nim$博弈的胜率最大值和平均值。

    考虑求出两个数组$dp[i]$和$g[i][0/1]$

    $dp[i]$表示到达的地方是$i$的情况下不论是谁的胜率。

    $g[i][0/1]$表示到达的点是$i$的情况下,当前要走的人是达哥/B哥的概率。

    两个数组都很好求,第一个反向拓扑即可,叶子节点都为0。

    $$dp[t]+=frac{(1-dp[x])}{d[t]}$$

    第二个正向拓扑即可,初始化$g[st][0]=1$。

    $$g[t][l]+=frac{g[x][l^1]}{d[x]}$$

    然后可爱的达哥又保证了所有的边$(a,b)$都保证$a<b$那么拓扑序就是$1-n$,直接循环即可。

    考虑统计答案。

    假设当前链接的两个点是$i,j$的话,如果我们不经过$i$点的话。

    胜率是:

    $$dp[st]g[st][0]-dp[i]g[i][0]-(1-dp[i])g[i][1]$$。

    如果经过呢?

    就有点麻烦了。

    分开考虑贡献即可。

    设$F[i][j]$为走$i$点,不论是谁的胜率。

    那么:

    $$F[i][j]=dp[i]frac{d[i]}{d[i]+1}+(1-dp[j])frac{1}{d[i]+1}$$

    那么胜率是:

    $$g[i][0]F[i][j]+g[i][1](1-F[i][j])$$

    那么:

    $$ans[i][j]=dp[st]g[st][0]-dp[i]g[i][0]-(1-dp[i])g[i][1]+g[i][0]F[i][j]+g[i][1](1-F[i][j])$$

    首先考虑求最大值。

    我们发现对于某一个$i$来说,除了$j$的部分其余贡献都是确定了的,确定最值只在于$F[i][j]$,枚举$j$复杂度又太高,但是发现$F[i][j]$的最值只和$dp[j]$有关,那么我们用一个$set$维护最值即可,可以$logn$查询出对于每个$i$的最优决策。

    再考虑求和。

    化一下式子就可以求出每个$i$的贡献。

    $$egin{array}{rcl}\Su&=&sumlimits_{i=1}^{n}ans[i]\&=&sumlimits_{i=1}^{n}left( (n-1)(dp[st]g[st][0]-dp[i]g[i][0]-(1-dp[i])g[i][1])+g[i][0]f[i]+g[i][1](1-f[i]) ight)end{array}$$

    $$f[i]=sumlimits_{j=1}^{n}[i!=j]F[i][j]$$

    对于每个$j$求个和即可。

    这样平均值也解决了。

  • 相关阅读:
    列表基本操作——1
    条件判断与嵌套
    数据拼接与数据转换
    变量与赋值
    打印数与type()函数
    print()函数与打印字符串
    arduino开发ESP8266学习笔记二----按键控制LED灯
    arduino开发ESP8266学习笔记一 ----点亮一个LED灯
    无线充电
    EMC设计总结
  • 原文地址:https://www.cnblogs.com/Lrefrain/p/11702747.html
Copyright © 2011-2022 走看看