闵可夫斯基和
-
给定两个向量空间 \(A\) 和 \(B\),则闵可夫斯基和 \(A+B={a+b,a\in A,b\in B}\)。当 \(A\) 和 \(B\) 都是凸包时,他们的闵可夫斯基和也是凸包。
-
考虑当 \(A\) 的轮廓是凸函数 \((i,f_i)\),\(B\) 的轮廓是凸函数 \((j,g_j)\) 时,\(A+B\) 的轮廓就是 \((k,\max_{i+j=k}f_i+g_j)\)。这也说明了为什么这里的 \(\max/\min\) 加法卷积能保持函数的凸性。
-
当 \(f\) 和 \(g\) 都是凸函数时,他们的 \(\min\) 加法卷积 \(h_k=\min_{i+j=k}f_i+g_j\) 有如下的快速计算方式:
-
考虑对 \(f\) 和 \(g\) 做差分,有 \(a_i=f_i-f_{i-1}\) 和 \(b_i=g_i-g_{i-1}\)。那么 \(h_k\) 本质上就是取 \(a\) 的一个前缀的 \(b\) 的一个前缀,使得取得的元素个数为 \(k\) 且元素和最小。因为 \(a\) 和 \(b\) 递增,因此本质上就是对 \(a\) 和 \(b\) 两个数组进行归并排序,\(h_k\) 就是前 \(k\) 个元素的和。也就是说,卷积后函数的斜率,等于卷积前两个函数的斜率做归并排序,这让我们可以快速对凸函数完成卷积转移。
例题
-
这道题和使用 Slope trick 的烟火表演很像但不一样,因为 \(i\) 和 \(fa[i]\) 之间的距离 \(l\in\{0,1\}\),所以 DP 函数右侧的拐点个数不等于儿子个数,无法直接维护最小值区间。
-
先列出 DP 方程,设 \(f(u,x)\) 表示以 \(u\) 为根的子树满足红黑树性质,且从 \(u\) 到任意后代叶子结点路径上都有 \(x\) 个黑色点需要的最少修改次数,\(g(u,0/1)\) 是让节点 \(u\) 变红/黑的代价。于是有了一个 naive 的方程:
-
可以证明 \(f(u,x)\) 关于 \(x\) 是凸的,因为 \(g(u,0/1)\) 是凸的(仅有两个点),两个凸序列的 \(\min\) 加法卷积的结果还是凸的。
-
我们像烟火表演中那样维护差分数组。由于 \(f(u,x)\) 中的 \(x\) 的取值范围是子树深度的 \(\min\),因此 \(\sum\) 部分可以直接把子树合并起来,复杂度是 \(O(n)\) 的(可以用长链剖分证明)。而 \(g\) 的差分是 \(\pm1\),因此我们还需要支持往差分数组里插入 \(1\) 或者 \(-1\),并维持数组的单调性,这一步就对应了我们快速维护闵可夫斯基和转移。
-
可以使用两个 vector,一个 vector 存所有负数,一个存所有整数,再开一个变量表示有几个 \(0\)。这时插入 \(1\) 就是在正数 vector 的开头插入,插入 \(-1\) 就是往负数 vector 的末尾插入。\(u\) 的答案就是 \(f(u,0)\) 加上差分数组的最小前缀和,也就是负数 vector 的元素之和。这样做复杂度是 \(O(n)\) 的。