Day5-Dp

典题

\(n\) 个物品的背包,\(V_i\in[1,4]\)\(w_i\le 10^9\)\(n\le 10^5\)

基于值域枚举后进行贪心

观察到 \(\operatorname{lcm}(1,2,3,4)=12\),于是我们可以将重量为 \(1,2,3,4\) 的分别打包为重量为 \(12\) 的。比如 \(12\) 个重量为 \(1\) 的可以凑成一组,其他同理。但是会出现零散的也就是无法打包的部分,由于值域很小,直接枚举即可。

\(cnt_i\) 表示重量为 \(i\) 的拿了多少个。我们枚举 \(cnt_1 \bmod 12\)\(cnt_2\bmod 6\)\(cnt_3\bmod 4\)\(cnt_4\bmod 3\)。接着选最大的 \(cnt_1\bmod 12\)\(1\)\(cnt_2\bmod 6\)\(2\)...

这么处理之后剩下的就都是重量为 \(12\) 的大组了,可以贪心去取。

分治-闵可夫斯基和

直接背包没有凸性,但是在 \(\bmod 12\) 意义下的每一个剩余系都具有凸性。

\(f_{i,k}\) 表示选了 \(12\times k+i\) 体积的物品,可以得到的最大价值。

我们可以采用分治,每个区间维护上述 \(12\) 的个凸函数,然后左右区间进行 \(12\times 12\) 次合并。

假设现在合并的是左 \(a\) 和右 \(b\),那么合并到大区间后就是 \(\to (a+b)\bmod 12\)。对于 \(k\) 那一维度可以做闵可夫斯基和。

CF1787H Codeforces Scoreboard

假设已经知道了哪些用 \(a_i\),哪些用 \(b_i-k_i\times t\),那么我们直接按照 \(k\) 从大到小排序,先选 \(k\) 大的,再选 \(k\) 小的,最后选那些 \(a_i\) 的就能保证最优。但是我们现在不知道选择了什么,可以先按照 \(k\) 降序排序,然后 dp,这样子就可以在决策的过程中符合上述贪心操作了。
\(dp_{i,j}\) 表示前 \(i\) 个题用了 \(j\) 个题是 \(b_i-k_i\times t\) 形式的所用最小时间。

\(dp_{i,j}=\max(dp_{i-1,j}+a_i,dp_{i-1,j-1}+b_i-k\times j)\)

这个形式很明显就是一个整体 dp 的形式,应该是要用大 DS 维护。

感性理解一下,这种加一个斜率为负的一次函数和常数取 \(\max\) 的东西应该是凸的。

打标/根据取 \(\max\) 的特性,可以得到 \(dp_{i,j}\) 对于每个 \(i\) 关于 \(j\) 是上凸的。

考虑 \(dp_{i,j}\) 的决策,

\[dp_{i-1,j}+a_i~\operatorname{vs}~dp_{i-1,j-1}+b_i-k_i\times j \]

假设我们选择前者,就要满足

\[dp_{i-1,j}+a_i\ge dp_{i-1,j-1}+b_i-k_i\times j \]

\[dp_{i-1,j}-dp_{i-1,j-1}\ge-k_i\times j+b_i-a_i \]

由于 \(dp\) 是上凸的,所以等式左边应该是单调递减的。等式右边也是单调的,所以可以直接二分找到交点。或者可以看成一条斜率为 \(-k_i\) 的直线去切 \(dp\) 的凸包。

假设我们找到了交点为 \(j=x_0\)

那么对于 \(j\le x_0\),我们要对于 \(dp\) 整体加 \(a_i\)

对于 \(j\ge x_0\),我们要对于 \(dp\) 平移(因为转移脚标是 \(j-1\to j\))之后加一个一次函数 \(-k_i\times j+b_i\)

有点难做,我们不妨维护其差分数组 \(g_{i,j}=dp_{i,j}-dp_{i,j-1}\)

思考差分的变化,

前一段的区间加就是差分的单点加减。然后交接点的地方处理要小心点,就是对于 \(j=x_0+1\),此时 \(dp_{i,x_0}=dp_{i-1,x_0}+a_i,dp_{i,x_0+1}=dp_{i-1,x_0}+b_i-k_i\times j\)\(g_{i,x_0+1}=b_i-a_i-k_i\times j\)

对于 \(j=x_0+2\)\(dp_{i,x_0+2}=dp_{i-1,x_0+1}+b_i-k_i\times (j+1)\)\(g_{i,x_0+2}=g_{i-1,x_0+1}-k\)。对于 \(j\) 更大的情况同理,这一部分就是平移之后后缀加一个 \(-k\)

所以我们可以发现对于 \(g\) 的操作就是单点加,单点插入 (\(x_0+1\) 处),还有后缀加。

可以用平衡树维护,时间复杂度 \(O(n\log n)\)

ABC305Ex Shoji

先思考段内权值,对于同一段内如何排序,可以用邻项交换法,发现按照 \(\dfrac{B}{A-1}\)

然后本题显然可以用 WQS 二分。

发现这个函数复合的增长是十分迅速的,至少也是 \(2^x\) 级别的,所以我们可以只取前 \(30\) 个点作为决策点。

P9266 [PA 2022] Nawiasowe podziały

wqs二分后,广义笛卡尔树上 DP。

环状邮局

如果随机化断环为链的话,是单次采用决策单调性分治是 \(O(nk\log n)\),发现断点的个数至少是 \(\dfrac{n}{k}\) 个的,于是我们随机 \(O(\dfrac{n}{k})\) 次,所以最后是 \(O(n^2\log n)\) 的。环状邮局

CF1842I Tenzing and Necklace

如果链状的,直接WQS二分+单调队列就行了。
先构造一组方案,然后根据相交 > 包含,发现其他方案的点必须是交错在初始方案中的,决策单调性分治。

gym102268J

考虑如果两端中 \(sum_i-sum_{i+1}>\max a\),我们可以不断把 \(i\) 段末尾的数放入第 \(i+1\) 段,直到出现合法。这种调整法太慢了。

我们发现如果能做调整,最后的 \(\sum sum_i^2\) 会变小,那么 \(\sum sum^2_i\) 最小的时候,就是不能调整了。于是可以 WQS 二分,然后斜率优化。至于构造方案可以记录前缀 \(\max \min\) 拼接。

P9338 [JOISC 2023 Day3] Chorus

发现最后分在一组的 \(AB\) 一定是在一个区间内的,且第 \(i\)\(A\) 一定和第 \(i\)\(B\) 一组,于是我们设 \(f_{i,k}\) 表示前 \(i\) 个里面分了 \(k\) 组。

\(k\) 可以用 WQS 二分去掉。\(i\) 的决策点用斜率优化和单调队列分别维护即可。

gym102331J

发现 \(f_{i,j}\) 是凸的,可以树链剖分。

也可以模拟费用流。

闵可夫斯基和优化DP

Gym102331H Honorable Mention

ZR2842

我们对于 \(0 1\)\(+-1\) 前缀和。我们发现一个长度 \(>1\)\(1\) 段是可以拆成多个小段的。

6289. 花朵

重链上分治NTT。

LOJ3661. 「2021 集训队互测」蜘蛛爬树

\(dis(u,v)+a_x\lvert i-j \rvert+2(x\to path(u,v))\)

A New Beginning

转化为曼哈顿,就是 \(\lvert X-x\rvert+\lvert Y-y \rvert\)。每次只能往右上/右下走。我们发现曼哈顿距离最近的时候是走到某个点垂直于 \(x\) 轴的线上。

\(dp_{i,j}\) 表示在 \(x_i\) 位置的上纵坐标为 \(j\)。同时满足 \(\lvert k-j\rvert\le x_i-x_{i-1}\)。DP 方程可以用 Slope Trick 优化。

posted @ 2024-08-03 11:07  Mirasycle  阅读(12)  评论(0编辑  收藏  举报