斜率优化做题笔记

P4360 [CEOI2004] 锯木厂选址

fi 表示仅在 i 位置修建一个锯木厂的最小费用,disi 表示从山脚到 i 位置的距离,sumi 表示从山顶到 i 位置的木材重量和,可以直接预处理出来。

那么第二个锯木厂修建在位置 i 的费用就是 min{fjdisi×(sumisumj)|j<i}

考虑两个转移点 j<k,若 j 对于当前位置 i 更优,那么:

fjdisi×(sumisumj)<fkdisi×(sumisumk)

fjfk<disi×(sumksumj)

fkfjsumksumj>disi

disi 随着 i 增大单调不降,维护 (sum,f) 的下凸包。

P2120 [ZJOI2007] 仓库建设

fi 表示在 i 工厂建立仓库,i+1n1 工厂不建立仓库的最小费用。对成品数量 p 做一遍前缀和。

转移直接枚举上一个建立的仓库位置:

fi=min{fj(pipj)×(xnxi)+ci|j<i}

考虑两个转移点 j<k,若 j 对于当前位置 i 更优:

fj(pipj)×(xnxi)+ci<fk(pipk)×(xnxi)+ci

fjfk<(xnxi)×(pipjpi+pk)

fkfjpkpj>xixn

xixn 随着 i 增大单调递增,维护 (p,f) 的下凸包。


可惜这个做法被 hack 了,因为 pn 可能为 0,最后一个工厂不一定要建仓库,所以不能在前面就把后面的贡献计算好。

fi 表示只考虑前 i 个工厂并在 i 工厂建立仓库的最小费用。

转移直接枚举上一个建立的仓库位置:

fi=min{fj+(l=j+1i(xixl)×pl)+ci|j<i}

fi=min{fj+(l=j+1ixi×pl)(l=j+1ixl×pl)+ci|j<i}

si 表示 xi×pi 的前缀和数组,然后对 p 做一遍前缀和:

fi=min{fj+xi×(pipj)(sisj)+ci|j<i}

考虑两个转移点 j<k,若 j 对于当前位置 i 更优:

fj+xi×(pipj)(sisj)+ci<fk+xi×(pipk)(sisk)+ci

fjxi×pj+sj<fkxi×pk+sk

fjfk+sjsk<xi×pjxi×pk

fkfj+sksjpkpj>xi

xi 随着 i 增大单调递增,维护 (p,f+s) 的下凸包。

如果中途出现了分母为 0 的情况,斜率应视为无穷大乘上纵坐标差的符号。因为下凸包横坐标相同时应保留纵坐标较小的点,加入一个纵坐标更小的点时队首会被弹掉,加入一个纵坐标更大的点时队尾会被弹掉,所以始终只保留了纵坐标最小的一个点。

最后答案就在最后一个 p>0 的位置到 n 中。

P3195 [HNOI2008] 玩具装箱

fi 表示前 i 个玩具都已经放入容器的最小费用。对一维长度 C 做一遍前缀和。

转移直接枚举上一段结尾:

fi=min{fj+(ij1+CiCjL)2|j<i}

考虑两个转移点 j<k,若 j 对于当前结尾 i 更优:

fj+(ij1+CiCjL)2<fk+(ik1+CiCkL)2

fjfk<(Ci+iL1Ckk)2(Ci+iL1Cjj)2

为了避免式子太长,设 t=Ci+iL1

fjfk<(tCkk)2(tCjj)2

fjfk<t22×t×(Ck+k)+(Ck+k)2t2+2×t×(Cj+j)(Cj+j)2

fj+(Cj+j)2fk(Ck+k)2<2×t×(Cj+jCkk)

fk+(Ck+k)2fj(Cj+j)2Ck+kCjj>2×t

t 随着 i 增大单调递增,维护 (Ci+i,fi+(Ci+i)2) 的下凸包。

P3648 [APIO2014] 序列分割

首先分的顺序不影响最后的总得分。假设三块内部的元素和分别是 a,b,c,显然 c(a+b)+ab=a(b+c)+bc=ab+ac+bc。每次分三块讨论就可以适用于所有情况。

fi,l 表示前 i 个元素分成 l 块的最大总得分。对元素 a 做一遍前缀和。

外层枚举 l,转移就枚举分界点,把当前这一块新加入进去:

fi,l=min{fj,l1+aj×(aiaj)|l1j<i}

考虑两个转移点 j<k,若 j 对于当前分界点 i 更优:

fj,l1+aj×(aiaj)>fk,l1+ak×(aiak)

fj,l1fk,l1+ak2aj2>ak×aiaj×ai

fk,l1ak2(fj,l1aj2)akaj<ai

ai 随着 i 增大单调不增,维护 (ai,fi,l1ai2) 的上凸包。

因为 0 选不选无所谓,所以这题可以删去所有 0 来避免出现分母为 0 的情况。当然,如果大于 0 的元素太少了,就把没选过的那些空位塞进来即可。

P3628 [APIO2010] 特别行动队

fi 表示前 i 个士兵组成特别行动队的最大修正战斗力之和。对初始战斗力做一遍前缀和。

转移还是枚举上一组结尾:

fi={fj+a×(xixj)2+b×(xixj)+c|j<i}

考虑两个转移点 j<k,若 j 对于当前结尾 i 更优:

fj+a×(xixj)2+b×(xixj)+c>fk+a×(xixk)2+b×(xixk)+c

fjfk>a×(xi22×xi×xk+xk2xi2+2×xi×xjxj2)+b×(xixkxi+xj)

fjfk>a×xk22×a×xi×xka×xj2+2×a×xi×xjb×xk+b×xj

fk+a×xk2b×xkfja×xj2+b×xjxkxj<2×a×xi

2×a×xi 随着 i 增大单调递减,维护 (x,f+a×x2b×x) 的上凸包。

posted @   御坂夏铃  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示