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\) 段的方案数,转移时:
而 \(\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\) 处转移如下:
最后再乘上标号系数:
可以做到 \(\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\) 的转移如下:

浙公网安备 33010602011771号