loading...

7.15 DP

[QOJ5507] Investors

给定一个长度为 \(n\) 的序列 \(a\),最多进行 \(k\) 次操作,每次可以选择一个区间加一个正整数,使区间逆序对数最小化。

\(n,k \le 6000\)

其实我们发现,问题就是说把序列划分为 \(k+1\) 段,并使各段的逆序对数之和最小。为什么?对于第一段来说,不操作,剩下的 \(k\) 段都要操作,使得前一个 \(\max\) 小于等于后一个的 \(\min\)。如果两段本身满足,即它们之间没有新的逆序对,完全可以合并在一段上。所以我们总能经过合并操作使序列划分 \(\le k+1\) 段。而段数越多逆序对数不增。

\(f_{i, j}\) 表示 \([1, i]\) 划分为 \(j\) 段的方案数,转移时:

\[f_{i,j} = \min _{k < i} \{f_{k, j-1}+\mathrm{inv}(k+1, i)\} \]

\(\mathrm{inv}(l, r)\) 满足四边形不等式 \(\mathrm{inv}(l, r)+\mathrm{inv}(l-1, r+1) \ge \mathrm{inv}(l,r+1) + \mathrm{inv}(l-1, r)\),故 dp 的转移具有决策单调性。时间复杂度 \(\mathcal O(n(n+k))\)。当然 wqs 二分也是可以做的,只是求 \(\mathrm{inv}(l, r)\) 复杂度似乎有点高。

[BalticOI 2020] 小丑

给定一张图,求删除编号在区间 \([l, r]\) 的边后,原图是否有奇环。

\(1 \le n, m, q \le 2 \cdot 10^5\)

首先做个小转化,把边序列复制一份放在后面,询问就变成只保留 \([r+1, l+m-1]\) 的边,原图是否为二分图。

问题不适合维护边的生存周期,所以不能用线段树分治直接做。

考虑对于每个 \(l\) 求出 \(p_l\) 表示 \([l,r]\) 区间不为二分图的最小 \(r\),回答可以做到 \(O(1)\)

容易发现 \(\forall i < j, p_i \le p_j\)。然后这就是有决策单调性(广义上?)的,可以用分治转移。具体地,对于分治区间 \([l,r]\),考虑 \(m = (l+r)/2\)\(p_m\),从 \(m\) 开始用并查集加,然后清空就行了。如果决策区间与 \([l,r]\) 交集为空,中间那一段的遍历反复执行就会复杂度爆炸,所以把那一段 \((r,pl)\) 在上级分治层传承下来。

[QOJ5367] 递增树列

给定一棵 \(n\) 个节点的有根树,根为 \(1\),求满足下面条件的排列 \(p\) 个数:

  • \(\forall 1<i<n\)\(\mathrm{dep}(\mathrm{lca}(p_i, p_{i-1})) \le \mathrm{dep}(\mathrm{lca}(p_i, p_{i+1}))\)

\(1 \le n \le 80\)

\(p\) 的个数与编号没有关系,可以钦定编号为 dfn 序。

观察到的现象是,所有 \(\mathrm{lca} (p_i,p_{i-1})\) 在一个 \(\mathrm {lca}(p_1,p_2)\) 到根的链上。\(p\) 的限制反过来,即变成前一个 \(\mathrm{dep}\) 大于后一个,显然数量不变,另一个观察是:在合法的 \(p\) 中,有 \(\mathrm{lca}(p_i,p_{i+1})=\mathrm{lca}(p_{i-1},p_i,p_{i+1})=\mathrm{lca}(p_1,p_2,\dots,p_{i+1})\)

所以 dp 可以考虑设一个状态 \(u\) 表示前缀 \(\mathrm{lca}\),对于一个 \(\mathrm{lca}\) 相同的段:这一段必须满足所有元素均为 \(u\) 的后代,且相邻两个不处于 \(u\) 下方同一个子树内。

\(u\) 处的转移分为如下二步:

  • 选择一个儿子 \(v\),钦定为下面的一个 \(\mathrm{lca}\),这构成子问题,记为 \(f_v\)
  • 剩余儿子的子树只关心每棵子树共有多少点,拎出来设为序列 \(c_{i}\),解决如下问题:
    • \(i\) 种物品有 \(c_i\) 个,要求把这些物品放在序列上,满足相同类型的物品不相邻。
  • 统计问题答案与 \(f_v\) 做乘积运算,最后 \(f_u\) 等于所有 \(v\) 的该问题答案。
  • 再进一步考虑,其实 \(v\) 中也可以留下一部分,放到 \(c_i\) 里面去,所以说 \(f_u\) 应该再加一维上传维 \(i\)。然后这些 \(c_i\) 其实也可以不用选完,而作为 \(u\) 的上传维的一部分。

物品相邻不相同(带标号,但可以先考虑不带标号,最后再算上带标号的贡献就行了)的问题:

考虑容斥,钦定一系列相同的物品放在一块的捆绑在一起。对于一个有 \(c_i\) 个物品的,把它变成 \(m\) 个段,也就是钦定了 \(c_i-m\) 个连续放置的对。容斥系数为 \((-1)^{c_i-m}\)

定义 \(g_j\) 表示放了 \(j\) 段,则在 \(c_i\) 处转移如下:

\[m=1,\dots,c_i\\ g'_{j} \gets g_{j-m}\times \binom {c_i-1}{m-1} (-1)^{c_i-m}\binom{j}{m} \]

最后再乘上标号系数:

\[\left(\sum g_i\right) \times \prod c_i! \]

可以做到 \(\mathcal O(n^2)\)

重申定义 \(f_{u,i}\) 表示 \(u\) 为根的子树内,剩余 \(i\) 个位置尚未加入排列中的方案数。

合并时,定义 \(g_{j, k}\) 表示共钦定了 \(j\) 个上传点,\(k\) 表示上面容斥时放的 \(k\) 段,对于答案的贡献(包含容斥系数)。容易发现这是一个二维卷积结构,复杂度等会分析。

最后将 \(f_{u,j} \gets g_{j, k}\)

对于 \(c_v\)\(f_{v,i}\),上传个数设为 \(i\),则对于数 \(i\)\(g\) 的转移如下:

\[y = 0,\dots,x;z=0,\dots,x-y\\ g_{j, k}' \gets g_{j-y, k-z} \times \binom{x-y-1}{z-1}(-1)^{x-y-z}\binom{k}{z} \]

posted @ 2026-07-17 08:14  goldspade  阅读(6)  评论(0)    收藏  举报