斜率优化 笔记
本文原在 2024-11-02 15:18 发布于本人洛谷博客。
推式子比代码长。
1. P3195 [HNOI2008] 玩具装箱
第一步:写出暴力
设 \(f_i\) 表示前 \(i\) 个玩具的最小答案,\(s_i\) 表示 \(C\) 的前缀和。
第二步:分流 & 拆式子
令 \(f_{i,j}=f_{j-1}+(i-j+s_i-s_{j-1}-L)^2\)。
即当 \(i\) 从 \(j\) 这个位置转移时的最小答案。
将只和 \(i\) 有关的和只和 \(j\) 有关的提出来。
令 \(g_i=i+s_i-L^{[1]}\),\(h_i=i+s_{i-1}\)。
\([1]\):常数项放哪边或者哪边都不放均可,由于待会还要拆平方,虽然最后会被消掉,但是哪边都不放中间的式子就会很长。
第三步:讨论后面的转移点比前面的更优的条件
若 \(j_1<j_2\),且 \(j_2\) 比 \(j_1\) 更优,即 \(f_{i,j_1}>f_{i,j_2}\):
令 \(y_i=f_{i-1}+h_i^2\):
\(s\) 单调递增,所以 \(h\) 也单调递增,所以 \(h_{j_1}-h_{j_2}<0\):
左边这个式子就相当于平面内经过 \(A(h_{j_1},y_{j_2})\) 和 \(B(h_{j_2},y_{j_2})\) 的直线 \(AB\) 的斜率(就是一次函数的 \(k\)),也就是说当这个斜率小于 \(2g_i\) 时,\(j_2\) 更优。
第四步:单调队列维护
令 \(K(j_1,j_2)=\frac{y_{j_1}-y_{j_2}}{h_{j_1}-h_{j_2}}\)。
可以证明转移点间的斜率一定是单调递增的:
考虑反证法。当 \(j_1<j_2<j_3\),\(K(j_1,j_2)>K(j_2,j_3)\) 时,假设 \(j_2\) 是最优转移点。则 \(j_2\) 优于 \(j_1\Rightarrow K(j_1,j_2)<2g_i\),\(j_2\) 也优于 \(j_3\Rightarrow K(j_2,j_3)>2g_i\),即 \(K(j_1,j_2)<2g_i<K(j_2,j_3)\),与条件矛盾,故假设不成立。
运用单调队列的思想,维护队列中相邻两个点的斜率单调递增,且保证队头和队头后一个点的斜率 \(>2g_i\),由于斜率单调递增,故前一个点总是优于后一个点,取队头就是答案。
所有情况的单调队列取法总结:
-
\(K(j_1,j_2)<g_i\),\(g_i\) 单调增:维护队头斜率大于 \(g_i\),斜率单调增,转移取队头。
-
\(K(j_1,j_2)<g_i\),\(g_i\) 单调减:维护队尾斜率小于 \(g_i\),斜率单调增,转移取队尾。
-
\(K(j_1,j_2)>g_i\),\(g_i\) 单调增:维护队尾斜率大于 \(g_i\),斜率单调减,转移取队尾。
-
\(K(j_1,j_2)>g_i\),\(g_i\) 单调减:维护队头斜率小于 \(g_i\),斜率单调减,转移取队头。
先删尾,再加入,再删头,再转移。
2.
简要题意:有一个长度为 \(n\le10^6\) 长度的数轴,除 \(0\) 号点外每个点上有个分数 \(a_i\)。任选跳跃策略,从 \(0\) 号点跳到 \(n\) 号点,从 \(j\) 跳到 \(i\) 的收益是 \(a_i(i-j)\),求最大分数。
令 \(f_{i,j}=f_j+ia_i-ja_i\)。
若 \(j_1<j_2\),且 \(f_{j_1}<f_{j_2}\):
其他情况 1:与斜率比较的对象没有单调性
其实很好处理,根据大于号和小于号,单调队列维护递增还是递减的四条规律仍然适用,但是不能再保证队头或队尾和比较对象的关系,所以变成单调栈,然后二分找就行了。
3. P4655 [CEOI2017] Building Bridges
光速推柿子(因为没啥用),令 \(G_i=h_i^2+w_{i-1}\),\(H_i=f_j+h_j^2-w_j\),得到:
然后发现由于 \(h\) 没有单调性,连斜率小于 / 大于一个对象的形式都写不出来。
其他情况 2:斜率也没有单调性
把式子推回去到这:
令 \(k=-2h_j\),\(b=f_j+h_j^2-w_j\)。
\(\min\) 里的可以用 李超线段树 维护。相当于查询 \(x=h_i\) 时,\(y\) 的最小值。由于插入的是直线而不是线段,所有数都是整数没有精度问题,而且只关心最小值的大小而不是编号,所以比模板好写多了。
不过要注意边界问题,第 \(0\) 条直线的 \(b_0=\infty\)。
4. P4027 [NOI2007] 货币兑换
贪心,如果在第 \(j\) 天买入并在第 \(i\) 天卖出,那么肯定是在第 \(j\) 天全买第 \(i\) 天全卖最优。
设 \(p_i,q_i\) 分别表示第 \(i\) 天 \(a,b\) 能买多少个:
把右边那一部分看成一次函数,李超线段树维护即可。
其他情况 2.1:\(x\) 坐标是小数
离散化即可,小心 unique 后炸精度。
更多类似题目
1/2. P3628 [APIO2010] 特别行动队 / SP15648 APIO10A - Commando
3. P5017 [NOIP2018 普及组] 摆渡车
4. P2900 [USACO08MAR] Land Acquisition G
本文作者:Garbage fish's Blog
本文链接:https://www.cnblogs.com/Garbage-fish/p/18709978
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步