思考题:一类sum转delta的贡献处理方式

点击查看做题思路 我们将贡献定义成某一类东西之和时,转移容易受到重重因素的限制。

因此,我们可以考虑将贡献仅仅记为答案于此处的delta,最后求解时将所有点的delta合并起来就是答案。

原理:delta在过程中可能会产生其他delta,但是由于产生其他delta并不会影响delta间的贡献,因此转移容易处理,有很好的独立性,在计数/概率期望题常见。

问题1. 有一条数轴,一个人初始在原点。每个点有一个值 \(p_i \in (0,1]\) 表示其在点 \(i\) 时,以 \(p_i\) 的概率随机向右,或以 \((1-p_i)\) 的概率向左走一步(如果在原点就只能向右),每走一步花费1秒,问第一次抵达点 \(n\) 的期望时间。

问题1.1 按照一般的期望设计思路,比如仿照DAG上游走的思路,你会怎么设计状态?

answer 设 $f_i$ 表示已经抵达点 $i$ 处,期望还需要多少时间抵达 $n$。

问题1.2 设计完成后,试着推导一下转移方程,并给出一种求解方式。

answer $f_i=1+(1-p_i)f_{i-1}+p_if_{i+1}$,使用高斯消元解方程。

问题1.3 有没有办法在不改变状态定义的情况下,让这个算法的时间复杂度降低到 \(O(n)\)?你可以试着设未知数。

answer 设 $f_1$ 的值为 $x$,可以推导出 $f_0$,然后可以推导出 $f_2 \dots f_n$,表示成一个 $x$ 的一次函数形式。最后 $f_n$ 与 $f_{n-1}$ 间有等式,可以求解出 $x$。

问题1.4 现在我们想要继续摒弃掉最终解方程的环节,有没有什么办法能够更改你的方程定义,使得 \(f_0\) 是一个开局就好求的值而非未知数?探究你能想到的所有定义,不论其转移方程是否可求。

answer $f_i$ 定义为当前在点 $i$ 第一次走到点 $i+1$ 所需要的期望时间。这时 $f_0=1$。

问题1.5 这个定义能写出递推式吗?试着自己总结其优化的原因。

answer $f_i=p_i\times 1+(1-p_i)(f_{i-1}+f_i)$,可以移项消元变为 $f_i=\frac{p_i+(1-p_i)f_{i-1}}{p_i}$,从而直接递推求解。
conclusion 这时我们将原先的求和定义(所有路上的贡献)改为了增量定义(走这一步的贡献)。由于期望的线性性,这个做法有正确性保证,且使得当前的贡献与后续操作无关,只与前面的值有关,取得了很好的独立性。

问题2. CF2034F2加强:以\((0,0)\)为起点,向上价值+1,向右价值+2。路上有 \(s\) 个关键点,抵达关键点时将价值乘全局定值 \(k\) 。点 \((x,y)\) 向右的概率为 \(\frac{n-x}{n-x+m-y}\),向上概率 \(\frac{m-y}{n-x+m-y}\),问抵达 \((n,m)\) 时价值的期望。
\(n,m\le 2\times 10^5,s\le 5\times 10^3\)

问题2.1 这类大平面关键点的题目有一个很经典的套路,将dp状态设为:设 \(f_i\) 表示所有到点 \(i\) 的方案中,抵达 \(i\) 时的总价值期望。这个定义属于求和定义还是增量定义?

answer 求和定义。

问题2.2 能推导出这个定义的转移式吗?时间复杂度如何?碰到了什么限制?

answer 考虑转移一个点 $i$ 的时候,枚举其上一次碰到的关键点是谁。设 $j$ 在 $i$ 左下方(不严格),则要求出 $j$ 到 $i$ 中间不经过其他关键点的方案数。这需要dp,时间复杂度为 $O(s^3)$。

限制在于,我们必须保证转移中间不能经过其他关键点,否则贡献会多算。

问题2.3 能否仿照例1,将求和贡献转化为增量贡献,这其中的增量怎么表示?再试着观察转移方程及其限制的变化。

answer 增量:乘 $k$ 可以看做加自身的 $k-1$ 倍。

转移:枚举贡献的来源,首先有初始贡献 \(2x+y\),你会发现无论走了什么样的路径,这项贡献本身都不会变。因为在路途上仅仅只是增添了一些它的复制品(而且复制品并不计入此处贡献,在产生复制品的点 \(j\) 作为转移点时才贡献),与其自身无关。然后乘上路径数和复制系数 \(k-1\)

而枚举左下角一个点 \(j\) 也可以贡献,得到了如下式子:

\[f_i+=f_j\times (k-1)\times g(x_j,y_j,x_i,y_i) \]

\[f_i+=(2x_i+y_i)\times (k-1)\times g(0,0,x_i,y_i) \]

\[g(x_1,y_1,x_2,y_2)=\binom{x_2-x_1+y_2-y_1}{x_2-x_1} \]

正常转移即可,最后答案是所有 \(f_i\) 求和然后除以 \(k-1\)

问题2.4 这个算法时间复杂度如何?为什么能有优化?

answer $O(s^2)$。因为我们改变定义之后不再需要限制中间不经过其他关键点,增量与增量之间在期望的定义下有独立性。

问题3 P11770 檐牙覆雪 半形式化题意:

给定整数 \( n \),表示 \( n \) 个窗沿(编号从 1 到 n,1 为最高)。初始时,仅窗沿 1 有一团体积为 1 的雪。

进行 \( n \) 次操作:第 \( i \) 次操作(\( i = 1, 2, \dots, n \))中,对于窗沿 \( i \) 上的每个雪团(体积记为 \( V \)),找出所有编号 \( j > i \) 且 \( j \) 是 \( i \) 的倍数的窗沿(即 \( j = k \cdot i \) 且 \( j \leq n \),\( k \geq 2 \)),将这些 \( j \) 按编号从大到小排序。然后,为排序后的第 \( k \) 个窗沿(\( k \) 从 1 开始)添加一团体积为 \( V + k \) 的新雪。

操作后,窗沿 \( i \) 上的雪团保持不变。

最终,求每个窗沿上所有雪团体积的最大值之和。

问题3.1 我们直接给出问题解决的前半段处理:考虑一个dp:确定 \(n\) 的情况下,\(f_i\) 表示位置 \(i\) 结束后的最大值是多少。对于转移,可以发现如果决策方式不是除一个最大质因子就不优。证明略去。
转移式形如:\(f_i={f_{\frac{i}{p}}+\lfloor\frac{n-i}{\frac{i}{p}}\rfloor+1}\)\(p\)\(i\) 的最大质因子。
问题在于,每次一旦修改 \(n\),就会使极多的 \(f_i\) 产生改变。
这里的状态设计是求和定义还是增量定义?这有没有让你想到优化方向?

answer 观察 $n=t-1$ 时与 $n=t$ 时的差别,发现只有某组 $(i,p)$ 满足 $\frac{i}{p}|t$ 时整除项会改变。仍然将每个点的贡献拆到其转移链上,每个点记其本身在多少条转移链上。然后对 $n$ 进行扫描线,用一个vector q[t]记录t的因子,但是要求其必须至少在一条转移链上才记(转移链不算开头x但是算结尾1)。到一个点就把每个因子处的贡献delta(整除项+1,有x条转移链到这里,那么答案就+x)加进答案即可。

问题3.2 此处能进行优化的核心原因是什么?

answer 虽然sum的变化量很多,但是delta的变化量很少,且我们可以预处理每个delta对答案的贡献系数。

[bonus1] 还有别的什么类型也能适用这样的优化?
[bonus2] 有些组合题(如排列计数)可以对于每个决策点计算其自身会带来多少限制,且永远都是给答案除一个定值。详见https://codeforces.com/contest/2164/problem/F2。

posted @ 2025-11-16 01:12  runzelai  阅读(5)  评论(0)    收藏  举报