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\) 是上凸的,所以等式左边应该是单调递减的。等式右边也是单调的,所以可以直接二分找到交点。或者可以看成一条斜率为 \(-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}\) 是凸的,可以树链剖分。
也可以模拟费用流。
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 优化。