闲话 23.1.10

闲话

新年了……

image
image
新年的军队

打算学习小孩召开法(
为未来的模拟赛的不可做题准备着(

今日是啥都没干日!

ETT 怎么学?

\((\max, +)\) 卷积(?)

image

虽然但是,现在我们不考虑一般的 \((\max, +)\) 卷积。对于一类特殊的问题,我们需要对任意 \(k\) 求得 \(f(n, k)\),保证贡献形如

\[f(i, j) = \max_{1\le p \le \min(k, r_i)} f(i-1, j-p) + a(i, p) \]

其中 \(a(i, x)\)\(x\) 有单调性。

观察这个贡献的式子,我们可以发现每个 \(f(i, j)\) 都可以被拆分为多个 \(p\),由不同的 \(f(i', p)\) 贡献。因此我们可以对贡献范围进行分治。
我们设 \(f([l, r], j)\) 为给 \(i'\in [l, r]\) 分配了 \(\sum p = j\) 情况下的最大贡献。容易发现 \(f([l,r],x)\)\(x\) 是有凸性的,证明考虑 \(f([l, l], p) = a(l, p)\) 有凸性,因此在不断取 \(\max\) 的过程中保持这个凸性。(凹性同理,对 \(\min\) 保持)

随后我们考虑分治的过程,最终需要合并 \(f([l, m], x)\)\(f([m + 1, r], x)\)\(x\) 的两个凸包。容易发现 \((\max, +)\) 卷积产生的凸包是这两个点集的 Minkowski 和,证明考虑定义。

因此我们如果能够快速求得两个点集的 Minkowski 和,我们就能在至多耗费 \(O(\log n)\) 倍的复杂度的情况下计算出 \(f([1, n], x)\)\(x\) 的凸包。

容易发现我们将两个凸包的边集按斜率作归并排序即可得到 Minkowski 和,应用在按向量存储的凸包上时就是按极角排序。
在此类问题中,我们一般对每个 \(x \in [1, n]\cap \mathbb N\) 保存一个 \(f([l, r], x)\),记作 \(f_x\)。因此这种情况下的斜率就是 \(\dfrac{f_x - f_{x-1}}{x - (x - 1)} = f_x - f_{x-1}\),即原 DP 数组的差分。同时由于作和之后需要保证是 \(+\) 卷积,差分后的首元素应当相加作为新差分数组的首元素。由于最终是分治的过程,我们总能够在过程中进行归并排序,总复杂度不会增加。
因此此类问题通常有复杂度 \(O(n \log n)\)

总结一下,对于一类 DP 数组与贡献值的第二维对第一维有凸性的转移方程,我们可以通过分治贡献范围的方法求解。对于两段贡献范围对应的 DP 数组,可以作差分后归并排序再求前缀和得到答案。

Forged in the Barrens

给定一个序列。一种 \(k\) 的方案是选择恰好 \(k\) 段不相交的区间,每一段的贡献是这段段首元素与段尾元素之差,这种方案的权值是 \(k\) 段的贡献之和。

请对每个 \(1\le k \le n\) 回答 \(k\) 的方案的最大权值。

\(1\le n \le 2\times 10^5, 1\le k \le 10^9\)

我们直接定义状态:\(f([l, r], 0/1, 0/1, x)\) 为当前对 \([l, r]\) 区间进行规划,已经选择了 \(x\) 段区间,其中左端点是否匹配、右端点是否匹配。

随后我们对每个区间保存 \(4\) 个凸包,根据不同的插头进行合并。举例来说,\([l,m]\) 中右侧未匹配的凸包可以和 \([m + 1,r]\) 中左侧未匹配的凸包进行合并。

总时间复杂度 \(O(n \log n)\)

posted @ 2023-01-10 22:16  joke3579  阅读(134)  评论(1编辑  收藏  举报