DP 加训

[PKUWC2018] Minimax

题目传送门

考虑设 $f_{i, j}$ 表示 $i$ 号点的权值是全局第 $j$ 大的概率。

显然有转移方程:$f_{i, j} = \begin{cases} p_i & soncnt = 0 \\ f_{son, j} & soncnt = 1 \\ p_i \sum\limits_{k = 0}^{j - 1} (f_{lson, k} f_{rson, j} + f_{rson, k} f_{lson, j}) + (1 - p_i) \sum\limits_{k = j + 1}^{m} (f_{lson, k} f_{rson, j} + f_{rson, k} f_{lson, j}) & soncnt = 2 \end{cases}$

($soncnt$ 表示儿子个数,$m$ 表示叶子总个数)。

记 $pre_{i, j} = \sum\limits_{k = 0}^{j - 1} f_{i, k}, suf_{i, j} = \sum\limits_{k = j + 1}^m f_{i, k}$,则有当 $soncnt = 2$ 时,$f_{i, j} = p_i (f_{lson, j} pre_{rson, j} + f_{rson, j} pre_{lson, j}) + (1 - p_i) (f_{lson, j} suf_{rson, j} + f_{rson, j} suf_{lson, j})$

发现转移形式可以线段树合并,具体地,在合并同时维护 $pre, suf$ 数组,转移即可,由于转移式有乘积形式,为保证复杂度需要写乘法 $tag$。

时间复杂度 $O(n \log{n})$

[NOI2020] 命运

题目传送门

这题推导转移方程的思路有点妙。

首先有关键性质:对于 $Q$ 中的限制 $(u1, v)$ 与 $(u2, v)$,设 $dep_{u1} > dep_{u2}$,则如满足了限制 $(u1, v)$,则 $(u2, v)$ 一定满足。所以对于限制 $(u, v)$ 中 $v$ 相同的若干限制,只需关心 $u$ 深度最大的限制即可。

所以考虑设 $f_{i, j}$ 表示只考虑 $i$ 子树内的边的取值时(即钦定子树外的边全 $0$)与该子树有关的限制中未满足的限制的 $u$ 最深的深度为 $j$ 的方案数,特别地,$f_{i, 0}$ 表示无未满足的限制。

考虑往以 $i$ 为根的子树内添加一棵以 $u$ 为根的子树的情况,显然对于 $f_{i, j}$ 会更新为若干 $f_{i, x} f_{u, y}$ 的和的形式,按照边 $(i, u)$ 的权值分类讨论。

如果 $w_{(i, u)} = 1$,则 $u$ 子树的限制显然全都满足,所以对于并入 $f_{i, j}$ 的 $f_{i, x} f_{u, y}$ 有 $x = j$ 且 $y$ 任意,则 $f_{i, j} = f_{i, j} \sum\limits_{k = 0}^{dep_u} f_{u, k}$

如果 $w_{(i, u)} = 0$,则对于合并入 $f_{i, j}$ 的 $f_{i, x} f_{u, y}$,需要满足 $\max(x, y) = j$,则 $f_{i, j} = f_{i, j} \sum\limits_{k = 0}^{j} f_{u, k} + f_{u, j} \sum\limits_{k = 0}^{j - 1} f_{i, k}$

设 $g_{i, j} = \sum\limits_{k = 0}^j f_{i, k}$ 并将上述讨论合并则有转移方程 $f_{i, j} = f_{i, j} (g_{u, dep_u} + g_{u, j}) + f_{u, j} g_{i, j - 1}$。

考虑线段树合并转移,$g_{i, j}$ 可以在合并过程中用 [PKUWC2018] Minimax 的方法求出,直接合并即可。

时间复杂度 $O(m \log{n})$

[八省联考 2018] 林克卡特树

题目传送门

首先注意到操作形式是断开 $k$ 条边后连 $0$ 边。

那么不难想到断开形如裂成若干连通块,而连 $0$ 边等价于若干连通块的答案相加,所以问题转化为求出 $k+1$ 个连通块的直径之和最大值。

考虑设 $f_{i, j, 0/1/2}$ 表示 $i$ 子树内,分成了 $j$ 个连通块,其余 $j-1$ 个连通块直径长加上与 $i$ 相连的连通块的贡献(贡献设为 直径/连到 $i$ 的最长直链/无)时的最大总贡献。

有转移

$f_{i, j, 0} = \max\limits_{k = 1}^{j}\{f_{i, j - k + 1, 0} + f_{u, k, 2}, f_{i, j - k + 1, 2} + f_{u, k, 0}, f_{i, j - k + 1, 1} + f_{u, k, 1} + w, f_{i, j - k, 0} + f_{u, k, 0}\}$

$f_{i, j, 1} = \max\limits_{k = 1}^{j}\{f_{i, j - k + 1, 1} + f_{u, k, 2}, f_{i, j - k + 1, 2} + f_{u, k, 1} + w, f_{i, j - k, 1} + f_{u, k, 0}\}$

$f_{i, j, 2} = \max\limits_{k = 1}^{j}\{f_{i, j - k + 1, 2} + f_{u, k, 2}, f_{i, j - k, 2} + f_{u, k, 0}\}$

状态数 $n^2$ 不太行,但注意到这个状态下的 $f_{i,0/1/2}$ 分别是凸函数。

所以考虑 wqs 二分,设 $g_{i, 0/1/2}$ 表示二分后的状态,则转移更改为

$g_{i, 0} = \max\{g_{i, 0} + g_{u, 2} - k, g_{i, 2} + g_{u, 0} - k, g_{i, 1} + g_{u, 1} + w - k, g_{i, 0} + g_{u, 0}\}$

$g_{i, 1} = \max\{g_{i, 1} + g_{u, 2} - k, g_{i, 2} + g_{u, 1} + w - k, g_{i, 1} + g_{u, 0}\}$

$g_{i, 2} = \max\{g_{i, 2} + g_{u, 2} - k, g_{i, 2} + g_{u, 0}\}$

初始值是 $g_{i, 0} = g_{i, 1} = g_{i, 2} = -k$,直接转移即可。

时间复杂度 $O(n \log{V})$。

[COCI2018-2019#4] Akvizna

题目传送门

首先有很显然的DP状态:设 $f_{i, j}$ 表示有 $i$ 个人被淘汰,并过了 $j$ 轮时的最大收益。

则有转移方程 $f_{i, j} = \max\limits_{k = 0}^{i - 1} { f_{k, j - 1} + \frac{i - k}{n - k} }$

注意到 $f_{i, 1 \sim k}$ 是凸的,所以考虑 wqs 二分。

显然 $f_{k, j - 1} + \frac{i - k}{n - k}$ 可化为 $f_{k, j - 1} + \frac{i}{n - k} - \frac{k}{n - k}$

则有 $f_{i, j} = \frac{1}{n - k} i + (f_{k, j - 1} - \frac{k}{n - k})$。

可以斜率优化,注意到 $i$ 和 $\frac{1}{n - k}$ 都是单调的,所以可以单调队列+斜率优化,发现 wqs 二分后不会改变这些性质,直接斜率优化即可。

时间复杂度 $O(n \log{V})$。

CF1801F Another n-dimensional chocolate bar

题目传送门

首先 $\prod\limits_{i} b_i \ge k \Rightarrow \prod\limits_{i} b_i > k - 1 \Rightarrow \dfrac{k - 1}{\prod\limits_{i} b_i} = 0$

所以考虑设 $f_{i, j}$ 表示考虑了前 $i$ 个数, $\dfrac{k - 1}{\prod\limits_{i} b_i} = j$ 时的最大权值。

显然有转移 $\dfrac{f_{i - 1, j} \times \frac{a_i}{x}}{a_i} \rightarrow f_{i, \lfloor \frac{j}{x} \rfloor}$。

定义 $S_i = \{ \lfloor \frac{i}{x} \rfloor \mid x \in \mathbb{N^+} \}$。

注意到第二维无论是转移前的 $j$ 还是转移后的 $\lfloor \frac{j}{x} \rfloor$,其值都在 $S_{k - 1}$ 中,且有 $\lfloor \frac{j}{x} \rfloor \in S_{j}$。

注意到 $|S_{x}| = O(\sqrt{x})$,所以考虑暴力枚举可能出现的转移点转移,则复杂度为 $\sum\limits_{i \in S_{k - 1}} |S_{i}| = O(k^{\frac{3}{4}})$。

总时间复杂度 $O(nk^{\frac{3}{4}})$。

答案为 $f_{n, 0}$。

CF1740F Conditional Mix

题目传送门

先考虑怎么判断可重集是否合法。

考虑一个题目中所定义的集合序列 $\{x_1, x_2, \cdots, x_n\}$(不足 $n$ 个集合用空集补全)。

注意到对于元素 $i$,若其在原序列中出现次数为 $cnt_i$,则其在集合序列中最多出现 $\min(cnt_i, k)$ 次,所以合法条件即 $\forall 1 \le k \le m, \sum\limits_{i = 1}^k |x_i| \le \sum\limits_{j = 1}^n \min(cnt_j, k)$。

考虑钦定 $x_i$ 按 $|x_i|$ 降序排列,记 $y_i = \sum\limits_{j = 1}^i |x_j|$,则上述条件即 $\forall 1 \le k \le m, y_k \le \sum\limits_{i = 1}^n \min(cnt_i, k)$,则 $y$ 序列每一位置的限制可以视为独立的。

此时有性质:若 $|x_i| > |x_j|$(显然 $i < j$),则一定存在一个 $x_i$ 中元素可以移到 $x_j$ 中。

所以记 $f_{i, j, k}$ 表示考虑了可重集中前 $i$ 个集合, $y_i = j, |x_i| = k$ 的方案数。

直接转移是 $O(n^4)$ 的,前缀和优化可以 $O(n^3)$。

注意到 $k = |x_i| \le |x_{i - 1}| \le \cdots \le |x_1|$,即 $k \times i \le j \rightarrow k \le \frac{j}{i}$,所以状态数只有 $O(n^2 \ln{n})$。

CF1773G Game of Questions

题目传送门

非常高妙的 DP。

首先有一个关键性质:假设一道题可以被做若干次,则第二次及以后不会改变人员情况。

这个是显然的,设原人员状态为 $S$,会第 $i$ 题的人为 $s_i$,则一道题做完会改变的人员情况是 $\begin{cases} S \cap s_i & S \cap s_i \not= \varnothing \\ S & otherwise \end{cases}$,显然有 $\begin{cases} (S \cap s_i) \in s_i & S \cap s_i \not= \varnothing \\ \forall T \in S, T \cap s_i = \varnothing & otherwise \end{cases}$,即再做一次不会改变状态。

注意到状态的改变是变成一个子集,可以考虑子集转移。

但注意到有些题目会使状态转移到自身,似乎不能直接转移。

这里有一个高妙性质:设当前状态为 $S$,能使当前状态改变的题目个数为 $c$,不能改变的题目个数为 $m$。考虑要计算第一次改变状态的选择选中 $s_i$ 的概率($s_i \cap S \not= \varnothing$),则我们忽略不改变当前状态的那部分题目时算出的答案与考虑那部分题目时的答案是一样的。

证明考虑设 $F_i$ 表示有 $i$ 道题无法改变状态时上述问题的概率,则 $F_i = \frac{1 + i F_{i - 1}}{c + i}$ 且 $F_0 = \frac{1}{c}$,则不难发现 $\forall i \ge 0, F_i = \frac{1}{c}$,即等于不考虑不改变当前状态那部分题目时的概率。

所以我们对于当前状态的转移,只需要计算仅考虑能改变状态的那部分题目即可。

接下来考虑转移的问题。

如果每次转移暴力枚举题目,时间复杂度 $O(n 2^m)$,很爆。

但注意到会有若干题目使转移后状态相同,即只需枚举子集转移。

所以考虑如何求出转移后状态相同的题目个数。

设 $G_{S, T}$ 表示从 $S$ 转移会到达 $T$ 的题目个数。

转移则考虑 $G_{S, T} = G_{S \cup \{p\}, T} + G_{S \cup \{p\}, T \cup \{p\}}$。

记 $cnt_S$ 表示从 $S$ 出发能改变状态的题目个数,则有 $cnt_S = \sum\limits_{\{T \mid T \in S\} / \{S, \varnothing\}} G_{S, T}$。

设 $f_S$ 表示到达 $S$ 状态的概率,则有 $ \frac{G_{S, T}}{cnt_S} f_S \rightarrow f_T$($T \in S \land T \not= S \land T \not= \varnothing$)。

转移 $f, G$ 复杂度均为 $O(3^m)$。

[ZJOI2016] 小星星

题目传送门

首先考虑暴力的DP,记 $f_{i, j, k}$ 表示将以 $i$ 为根的子树对应到图上,$i$ 点对应的是 $j$ 点,点集为 $k$ 的方案数。

转移复杂度 $O(3^n n^3)$,无法接受。

考虑DP数组 $k$ 这一维维护的限制仅仅是满足对应的点不能重复,则考虑去掉这一维限制而改用容斥。

假设现在已经去掉树上的点与图上的点一一对应这一限制。

记 $f_i$ 表示钦定树上的点对应到图上的点后,有至少 $i$ 个图上的点没有被对应的方案数。

记 $g_i$ 表示钦定树上的点对应到图上的点后,有恰好 $i$ 个图上的点没有被对应的方案数。

则 $f_i = \sum\limits_{j = i}^n \dbinom{j}{i} g_j$

二项式反演得 $g_i = \sum\limits_{j = i}^n \dbinom{j}{i} (-1)^{j - i} f_j$

由于我们只需要求 $g_0$,所以容斥系数等价于 $(-1)^i$。

则DP去掉了 $k$ 这一维,单次DP复杂度 $O(n^3)$,由于要计算 $f$ 则需要枚举哪几个点钦定不能被对应,则外层枚举复杂度 $O(2^n)$,总复杂度 $O(2^n n^3)$。

P4321 随机漫游

题目传送门

图上随机游走一类的问题基本都需要通过列方程高斯消元求解。

设 $f_{S, i}$ 表示当前已经走过了 $S$ 点集内的点,且在 $i$ 点,需要走完未走过的所有点所需花费的期望用时。

状态数是 $O(n2^n)$ 的,所以直接对这些状态设方程高斯消元复杂度是 $O((n2^n)^3)$,无法接受。

但考虑写出DP的转移方程:$f_{S, i} = \frac{1}{d_i} \sum\limits_{(i, v) \in E} f_{S \cup \{v\}, v} + 1$。

然后按照 $v \in S$ 是否成立变换一下转移方程:$f_{S, i} - \frac{1}{d_i} \sum\limits_{(i, v) \in E, v \in S} f_{S, v} = \frac{1}{d_i} \sum\limits_{(i, v) \in E, v \notin S} f_{S \cup \{v\}, v} + 1$

此时考虑对于所有 $i$ 同时求出 $f_{S, i}$,发现列出的高斯消元只有 $n$ 个变量,则单次消元复杂度为 $O(n^3)$,按 $|S|$ 从大到小转移,总复杂度 $O(2^n n^3)$。

[NOI2015] 寿司晚宴

题目传送门

偏抽象的一个题,硬控我一小时。

考虑对每个质因子记录它被选入集合1 / 集合2 / 不选,则状态大小为 $3$ 的质因子个数次方,显然过不去。

考虑对质因子根号分治,对 $\le \sqrt{n}$ 的质因子记录它的状态,而对于 $> \sqrt{n}$ 的质因子,我们发现一个数中至多存在一个这样的质因子。

所以考虑按大于根号的质因子分类,如果只考虑未状压部分的限制,则每一类中的限制仅是不能同时存在分别处于两个集合的元素,且不同类之间没有限制。

于是就可以状压了,时间复杂度 $O(3^8 n)$。

[CQOI2012] 局部极小值

题目传送门

不会搜索导致的。

首先不难发现局部极小值的个数最多只有 $8$ 个,所以考虑对这个去DP。

考虑从小到大填数,记 $f_{i, S}$ 表示当前填了 $1 \sim i$ 的数,局部极小值填的状态为 $S$ 的方案数。

考虑再记 $g_S$ 表示局部极小值填的状态为 $S$ 时下一步非局部极小值能填的位置有几个。

则有转移 $f_{i, S} = \sum\limits_{u \in S} f_{i - 1, S / \{u\}} + f_{i - 1, S} \times (g_S + |S| - (i - 1))$

但注意到这个DP的答案并不是我们要求的结果。

因为这个DP可能会把一部分原图的非局部极小值变成局部极小值。

所以考虑容斥,不妨钦定若干个原图非局部极小值的位置被算成局部极小值去进行上述DP,则设钦定的个数为 $x$ 个,那么容斥系数即 $(-1)^x$。

至于怎么钦定,DFS即可。

随机数生成器

题目传送门

属于是容斥学傻了。

首先差分,记 $P_i$ 表示最大值 $\le i$ 的概率,则最终答案即 $\sum\limits_{i = 1}^x (P_i - P_{i - 1}) \times i$。

然后有个性质:包含别的查询区间的那些查询区间没有贡献,可以删去。

所以删完后的查询区间按左端点排序后右端点也是有序的。

考虑怎么算 $P_i$,注意到 $P_i$ 的意义其实是每个查询区间内至少存在一个 $\le i$ 的数的方案数。

(这里笔者想容斥想了 1h 无果,遂放弃,警钟敲烂)

先转化为求方案数,则记 $g_i$ 表示选择 $i$ 个点使得每个查询区间内至少存在一个被选择的点的方案数,则 $P_i = \dfrac{\sum\limits_{j = 0}^n g_j \times i^j \times (x - i)^{n - j}}{x^n}$。

考虑怎么求 $g_i$。

首先将询问区间排序,而后预处理出覆盖每个位置 $i$ 的最左询问区间 $L_i$ 与最右询问区间 $R_i$。

记 $f_{i, j}$ 表示考虑了前 $i$ 个位置,选择了 $j$ 个点且第 $i$ 个点被选时使得编号为 $1 \sim R_i$ 的询问区间内都至少存在一个被选择的点的方案数。

则 $f_{i, j} = \sum\limits_{1 \le k < i, R_k \ge L_i - 1} f_{k, j - 1}$

双指针+前缀和优化可以做到 $O(n^2)$,则有 $g_i = \sum\limits_{1 \le j \le n, R_j = m} f_{j, i}$,其中 $m$ 为删去无用区间后的总区间数。

总复杂度 $O(n^2)$。

[九省联考 2018] 秘密袭击 coat

题目传送门

这个题给我创了3天/fn

有个显然的观察是,把题目所求转化为求有多少个树上的连通块包含 $\ge a$ 个 $\ge b$ 的点。

记 $f_{i, j, k}$ 表示考虑以 $i$ 为根的子树,包含 $\ge j$ 个 $\ge k$ 的点的方案数。

由于要求的是任意连通块,再记录 $g_{i, j, k}$ 表示 $f$ 的子树和。

直接 DP 复杂度爆炸,但发现转移是一个树上背包,考虑列出生成函数。

但列出生成函数无法直接优化转移,但可以观察到答案是一个多项式的系数,所以考虑拉格朗日插值。

那么每次 DP 就只需要一个 2 维的状态,但转移中有以下操作:全局加一,前缀乘 $x$,两个 $f$ 数组对应点相乘,将 $f$ 加入 $g$ 中。

最开始的观察是注意到 DP 的转移对于第二维是独立的,所以考虑对每一个第二维独立算答案,可以树剖优化,复杂度 $O(n^2\log^2{n})$,虽然复杂度对了,但实际上过不去。

原因是树剖需要撤销 DP 贡献,但由于模数较小,有可能出现 DP 原贡献是 $0$ 的情况,此时没有逆元,导致撤销爆炸。

于是我在这上面卡了好久/fn

但事实上不需要把第二维独立。

考虑把操作写成一个变换:$(f, g) \times (a, b, c, d) = (af + b, cf + d + g)$。

发现所有操作都可以由这个变换表示,事实上这个变换就是操作的矩阵将有效运算提取的结果,所以这个变换也是有结合律的。

线段树合并即可,时间复杂度 $O(n^2 \log{n})$。

posted @ 2024-01-08 14:14  ORzyzRO  阅读(45)  评论(0)    收藏  举报