A
一棵二叉树,相同深度的点位置相邻的有一条边,给出两条根开始的路径,可以向上/左/右/左儿子/右儿子走,问最后走到的两个点最短距离。路径长度 \(\le 10^5\)。
考虑求出两条路径分别走到的位置,用根开始的路径表示,每次向左/向右,用 \(0/1\) 表示。
最后统计答案,两个点一定是走到某个深度再碰面,从第一处分叉点开始,浅到深枚举这个深度。
路径用二进制表示出来即可。考虑计算这个二进制数,我们可以表示为重复 \(\times 2+d_i\) 的形式。
把 \(d_i\) 求出来,最后不停地进位即可。
B
\(n\) 个长度为 \(m\) 的字符串,其中有若干个位置是不确定的,随机填一个小写字母进去,问字典树节点个数的期望。\(n\le 12,m\le 1000\)。
考虑拆贡献,一棵字典树我们计算其每个节点的贡献。
枚举集合 \(s\) 里的串在第 \(p\) 位组成一个节点的概率,如果不考虑 \(s\) 外的串那么概率容易计算。
但是会导致集合外的串也可能前 \(p\) 位与 \(s\) 集合相等,也就是说一个方案会被算多次,有两种容斥:
\(s\) 的答案减去所有 \(s\subset t\) 的 \(t\) 的答案;或者是加上 \(|s|=1\) 的,减去 \(|s|=2\),加上 \(|s|=3\) 的...
原理是跟二项式反演的原理相同:也就是 \(C_{|s|}^1-C_{|s|}^2+C_{|s|}^3+...=1\)。
即大小为 \(|s|\) 的一个方案,会被 \(t\subset s\) 的计算到 \(C_{|s|}^{|t|}\) 次,抵消掉贡献使得系数为 \(1\)。
C
A 与 B 玩石头剪刀布,一轮游戏分为 \(n\) 局,给出每局 B 出什么的概率。对于每一轮赢得多的人获胜,如果赢的数量相同那么平局,该轮作废,若 A 连续赢 \(m_1\) 局 A 胜,B 连续 \(m_2\) 局 B 胜,安排 A 每局的策略,问 A 胜的最大概率。 \(n\le 1000,m\le 100\)。
考虑设计一个 dp,设 \(f_{x,y}\) 表示当前进行了 \(x\) 局,当前差为 \(y\) 局,A 赢的概率,转移取最大的转移即可。
但是有一个问题,就是若 \(y=0\) 平局的话,会返回 \(f_{0,0}\),那么就无法 dp 因为有后效性。
也就是说在一轮中会出现平局,避免平局的干扰,所以我们需要求胜的概率与负的概率之比的最大值。
出现比值考虑用分数规划,不妨当前二分到 \(mid\),也就是说检验 \(p(win)-p(lose)\times mid\ge 0\)。
dp 的时候直接求当前 \(p(win)-p(lose)\times mid\) 的最大值即可。
这么做的话,边界条件就明了,\(f_{n,0}=0,f_{n,-y}=-mid,f_{n,y}=1\)。
如果一定要求胜利的概率的话,也可以直接而二分 \(f_{n,0}\) 的取值,看最后 \(f_{0,0}\) 与其比较大或小即可。
再求出负的概率也是一样。