不知道为啥达哥说简单。。。。。。
考场上打了俩小时啥也没写出来导致崩盘了。
但是真的是好题啊。
要求在$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$的贡献。
$$\begin{array}{rcl}\\Su&=&\sum\limits_{i=1}^{n}ans[i]\\&=&\sum\limits_{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])\ \right)\end{array}$$
$$f[i]=\sum\limits_{j=1}^{n}[i!=j]F[i][j]$$
对于每个$j$求个和即可。
这样平均值也解决了。
原文地址:https://www.cnblogs.com/Lrefrain/p/11702747.html