【前置知识】
convex 与 concave:这是对于数组的概念。类比函数,下凸就是 convex,上凸就是 concave。
【<min,+>卷积问题】
考虑两个数组 ,定义它们的<min,+>卷积结果 :
-
。
-
。
因为普通的卷积是 ,形式类似。所以这种运算就叫做<min,+>卷积。<max,+>卷积的定义是类似的。
这个问题目前没有快于 的解法,但是在特殊情况下可以做一些优化。
【双 convex 情况】
结论:如果 都 convex,可以 解决这个问题。
考虑 的差分数组 。(,)
则 就是在 中最小的 个数之和。
容易证明,不再赘述。
【单 convex 情况】
结论:如果 是任意数组, 是 convex 的,可以做到 解决。
这个情况比上面的复杂很多。我们先定义一下两个函数方便叙述。
观察 1: 实际上等于 处, 最低点的值。
观察 2: 是 的平移。
于是求 数组,实际上等价于求 的下凸壳。下面讲解怎么求。
由观察 2 知 与 最多一个交点( 时)。有了这个观察能做什么?
其实这里已经可以用李超线段树做了,不过李超树是 的,我们像四边形不等式的队列那样,进一步优化。
维护队列 保存 ,表示当前还有用的函数图像有 。现加入 。若 与 的交点在 与 的交点左侧,则 没有用了,可以弹出。进行完所有弹出后,假设此时队列末尾元素为 (如果队列弹空了就直接加入 )。在 有用的区间内二分,找到第一个 的位置 。从 往后,。
在具体实现时,除了记录 ,还要记录它的有用区间 。这和四边形不等式的二分队列是一样的。
二分带一个 ,而函数个数是 ,所以总复杂度是 的。
【背包优化】
【01 背包优化】
记总重量为 ,重量种类数为 ,这里给出一个 的做法。
把物品按重量从大到小排序,同重量按价值从大到小排序。
令 表示考虑完前 种重量后,选一些物品总重为 的最大价值。
从 怎么推到 ?设第 类重量为 。用 表示在第 类中选总重为 的物品(其实就是选 个)的最大价值。
观察发现 是 concave 的。因为 比 选多一个物品,而且这多的一个物品必然是价值第 大的物品。再多选一个,就是第 大的了。以此类推,增长的价值必然递减。
把 按 的余数分类,每一类单独与 做<max,+>卷积,就能得到对应位置的 。每一类 的长度是 , 的长度是 ,一共做 次(余数分 类)。所以复杂度是 。
注意这里不能直接把 拓展到长度为 的数组,然后拿这个拓展后的数组卷。因为拓展后 显然就不 concave 了。
一共 种重量,所以复杂度是 。排序还有 。总复杂度 。
【完全背包优化】
这个优化和<max,+>卷积凸优化没关系。
设最大重量为 ,总重 ,给出一个 的解法。基于倍增。
令 表示总重为 时的最大价值。暴力求出 ,复杂度 。
有:当 ,。
进而可以得到: 和 做一次<max,+>卷积可以得到 。我们只需要 的来做这个就够了。
既然 可以从 ,那么直接倍增就可以做到 。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战