なんでバカのブログを読みたいの!为什么要看菜鸟的博客!|

园龄:粉丝:关注:

斜率优化 笔记

本文原在 2024-11-02 15:18 发布于本人洛谷博客。

推式子比代码长。

1. P3195 [HNOI2008] 玩具装箱

第一步:写出暴力

\(f_i\) 表示前 \(i\) 个玩具的最小答案,\(s_i\) 表示 \(C\) 的前缀和。

\[f_i=\min_{j=1}^{i-1}\{f_{j-1}+(i-j+s_i-s_{j-1}-L)^2\} \]

第二步:分流 & 拆式子

\(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]\):常数项放哪边或者哪边都不放均可,由于待会还要拆平方,虽然最后会被消掉,但是哪边都不放中间的式子就会很长。

\[\begin{align*} f_{i,j}&=f_{j-1}+(g_i-h_j)^2 \\&=f_{j-1}+g_i^2-2g_ih_j+h_j^2 \end{align*} \]

第三步:讨论后面的转移点比前面的更优的条件

\(j_1<j_2\),且 \(j_2\)\(j_1\) 更优,即 \(f_{i,j_1}>f_{i,j_2}\)

\[\begin{align*} f_{j_1-1}+g_i^2-2g_ih_{j_1}+h_{j_1}^2&>f_{j_2-1}+g_i^2-2g_ih_{j_2}+h_{j_2}^2 \\(f_{j_1-1}+h_{j_1}^2)-(f_{j_2-1}+h_{j_2}^2)&>2g_i(h_{j_1}-h_{j_2}) \end{align*} \]

\(y_i=f_{i-1}+h_i^2\)

\[y_{j_1}-y_{j_2}>2g_i(h_{j_1}-h_{j_2}) \]

\(s\) 单调递增,所以 \(h\) 也单调递增,所以 \(h_{j_1}-h_{j_2}<0\)

\[\frac{y_{j_1}-y_{j_2}}{h_{j_1}-h_{j_2}}<2g_i \]

左边这个式子就相当于平面内经过 \(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=\max_{j=0}^{i-1}\{f_j+a_i(i-j)\} \]

\(f_{i,j}=f_j+ia_i-ja_i\)

\(j_1<j_2\),且 \(f_{j_1}<f_{j_2}\)

\[\begin{align*} f_{j_1}+ia_i-j_1a_i&<f_{j_2}+ia_i-j_2a_i \\f_{j_1}-f_{j_2}&<a_i(j_1-j_2) \\\frac{f_{j_1}-f_{j_2}}{j_1-j_2}&>a_i \end{align*} \]

其他情况 1:与斜率比较的对象没有单调性

其实很好处理,根据大于号和小于号,单调队列维护递增还是递减的四条规律仍然适用,但是不能再保证队头或队尾和比较对象的关系,所以变成单调栈,然后二分找就行了。

3. P4655 [CEOI2017] Building Bridges

\[w_i\gets w_{i-1}+w_i \]

\[f_i=\min_{j=1}^{i-1}\{f_j+(h_i-h_j)^2+w_{i-1}-w_j\} \]

光速推柿子(因为没啥用),令 \(G_i=h_i^2+w_{i-1}\)\(H_i=f_j+h_j^2-w_j\),得到:

\[H_{j1}-H_{j2}>2H_i(h_{j1}-h_{j2}) \]

然后发现由于 \(h\) 没有单调性,连斜率小于 / 大于一个对象的形式都写不出来。

其他情况 2:斜率也没有单调性

把式子推回去到这:

\[f_{i}=\min_{j=1}^{i-1}\{f_j+h_i^2-2h_ih_j+h_j^2+w_{i-1}-w_j\} \]

\(k=-2h_j\)\(b=f_j+h_j^2-w_j\)

\[f_{i}=h_i^2+w_{i-1}+\min_{j=1}^{i-1}\{kh_i+b\} \]

\(\min\) 里的可以用 李超线段树 维护。相当于查询 \(x=h_i\) 时,\(y\) 的最小值。由于插入的是直线而不是线段,所有数都是整数没有精度问题,而且只关心最小值的大小而不是编号,所以比模板好写多了。

不过要注意边界问题,第 \(0\) 条直线的 \(b_0=\infty\)

4. P4027 [NOI2007] 货币兑换

贪心,如果在第 \(j\) 天买入并在第 \(i\) 天卖出,那么肯定是在第 \(j\) 天全买第 \(i\) 天全卖最优。

\(p_i,q_i\) 分别表示第 \(i\)\(a,b\) 能买多少个:

\[p_i=\frac{f_ir_i}{a_ir_i+b_i},q_i=\frac{f_i}{a_ir_i+b_i} \]

\[\begin{align*} f_i&=\max(f_{i-1},\max_{j=1}^{i-1}\{a_ip_j+b_iq_j\}) \\&=\max(f_{i-1},\max_{j=1}^{i-1}\{b_i(p_j\frac{a_i}{b_i}+q_j)\}) \end{align*} \]

把右边那一部分看成一次函数,李超线段树维护即可。

其他情况 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 中国大陆许可协议进行许可。

posted @   Garbage_fish  阅读(5)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起