闲话 23.1.10
闲话
新年了……
打算学习小孩召开法(
为未来的模拟赛的不可做题准备着(
今日是啥都没干日!
ETT 怎么学?
\((\max, +)\) 卷积(?)
虽然但是,现在我们不考虑一般的 \((\max, +)\) 卷积。对于一类特殊的问题,我们需要对任意 \(k\) 求得 \(f(n, k)\),保证贡献形如
其中 \(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 数组,可以作差分后归并排序再求前缀和得到答案。
给定一个序列。一种 \(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)\)。
以下是博客签名,与正文无关。
请按如下方式引用此页:
本文作者 joke3579,原文链接:https://www.cnblogs.com/joke3579/p/chitchat230110.html。
遵循 CC BY-NC-SA 4.0 协议。
请读者尽量不要在评论区发布与博客内文完全无关的评论,视情况可能删除。