当前位置: 首页 > news >正文

DP优化(Slope Trick,wqs二分,斜率优化)

Slope Trick

凸函数的封闭性

若 $ f $ , $ g $ 是凸函数,则 $ ( f + g ) $ 也是凸函数

若 $ f $ 是凸函数, $ g \in [0,+\infty] $,则 $ fg $ 也是凸函数

若 $ f $ , $ g $ 是凸函数,则 $ \max ( f , g ) $ 也是凸函数

卷积下确界

若 $ f $ , $ g $ 是凸函数,则 $ h(x) = \min_y ( f ( y ) + g ( x - y ) ) $ 也是凸函数

eg : 若 $ f $ 是凸函数,则 $ h(x) = \min_{ x - a \leq y \leq x + b } f ( y ) $ 也是凸函数

定义 $ g( x ) = \begin{cases}
0 , x \in [ - b , - a ]\
+\infty , \text{otherwise}
\end{cases}
$
则 $ h $ 是 $ f $ , $ g $ 的卷积下确界

斜率维护方式

  • 直接维护拐点,用 $set$ 、堆等(一般斜率变化不大时使用)

  • 维护每一段的左右端点和斜率,用李超线段树等

例题

[BalticOI 2004] Sequence (Day1)

设 $ dp $ 表示当前遍历到第 $ i $个数,选择的最大数 $ \leq j $ 时的最小代价

列出 $ dp $ 式 : $ dp_{i,j} = \min_{k=0}^{j-1} dp_{i-1,k} + | ( a_i - j ) | $

注意到每次整个 $dp$ 矩阵要向右平移一位,为了维持斜率值变化量在 $ [ 1 , n ] $ 之间,提出来单独处理;

拆分操作为:

  • 加一个 " V " 形的函数

  • 取前缀最小值

操作 $ 2 $ 实质上为将当前凹函数的所有 $ > 0 $ 的斜率段改为 $ 0 $ ,而操作 $ 1 $ 可以看成斜率比当前函数的负斜率段还要小的段斜率集体 $ -1 $ ,斜率比当前函数的负斜率段大的段斜率集体 $ + 1 $

两边都操作太麻烦,因为斜率段之间只有相对大小关系,于是,考虑直接将前者 $ -2 $

用堆维护,每次添加两次当前点,再弹出

操作:

无标题

原本的堆顶 $ 0 $ 在 $ +1 $ 之后变成了正斜率,应该被弹出

最后记录方案,显然每次弹出前的堆顶是当前点的最优决策

#include<bits/stdc++.h>
#define fre(s,i,j,k) for(int s=i;s<=j;s+=k)
#define rep(s,i,j,k) for(int s=i;s>=j;s-=k)
using namespace std;
const int N=1e6+5;
int n,ans[N];
long long answer;
priority_queue<int>ve;
main(){cin>>n;fre(i,1,n,1){int x;cin>>x;ve.push(x-i),ve.push(x-i);answer+=(ve.top()-(x-i)),ve.pop();ans[i]=ve.top();}cout<<answer<<"\n";rep(i,n-1,1,1)ans[i]=min(ans[i],ans[i+1]);fre(i,1,n,1)cout<<ans[i]+i<<"\n";
}

[NOISG 2018 Finals] Safety

和前一题相似,只不过这题要维护两个堆,分别为正斜率和负斜率

wqs 二分

考虑一个严格凸函数 $ f( x ) $ ,想要快速求解 $ f( x_0 ) $,但不好直接求

如果对于任意 $ k $ 能够快速求解 $ \min{{f( x ) - k x }} $ 以及 $ y = f( x ) $ 与 $ y = k x $ 的切点值 $ x_k $ ( $ x_k = \arg \min{{f( x ) - k x }} $ )

由于 $ f $ 是凸函数,则 $ x_k $ 关于 $ x $ 是单调递增的

二分 $ x_k $ ,若 $ x_k < x_0 $ ,则放大斜率,反之缩小,最后找到相切于 $ x_0 $ 的斜率 $ k_0 $ ,记此时求解出来的 $\min{{f(x)-k_0x}} = V(k_0) $ , 则 $f(x_0) = V(k_0) + k_0 x_0 $

例题

[国家集训队] Tree I

通过操作白边边权达到减少或增加白边数量的目的,二分额外边权即可

#include<bits/stdc++.h>
#define fre(s,i,j,k) for(int s=i;s<=j;s+=k)
#define rep(s,i,j,k) for(int s=i;s>=j;s-=k)
using namespace std;
using namespace FastIOS;
const int N=5e4+5,M=1e5+5,INF=1e9;
int n,m,need,fa[N];
struct Edge{int u,v,w,col;}ed[M];
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
pair<bool,int>check(int val){fre(i,1,m,1)if(!ed[i].col)ed[i].w+=val;sort(ed+1,ed+m+1,[](Edge x,Edge y){return x.w==y.w?x.col<y.col:x.w<y.w;});int cnt=0,sum=0,cntb=0;fre(i,1,n,1)fa[i]=i;fre(i,1,m,1){int x=find(ed[i].u),y=find(ed[i].v);if(x!=y)fa[x]=y,cnt++,sum+=ed[i].w,cntb+=(!ed[i].col);if(cnt==n)break;}fre(i,1,m,1)if(!ed[i].col)ed[i].w-=val;return {cntb>=need,sum};
}
main(){n=rd(),m=rd(),need=rd();fre(i,1,m,1)ed[i]={rd()+1,rd()+1,rd(),rd()};int l=-INF,r=INF;while(l+1<r){int mid=(l+r)>>1;if(check(mid).first)l=mid;else r=mid;}wt(check(l).second-l*need);ios_end();
}
http://www.jsqmd.com/news/339012/

相关文章:

  • 寒假不摆烂!文旅研学机构帮娃解锁成长新方式 - 品牌测评鉴赏家
  • 宏智树 AI:毕业论文写作 “卡壳”?科普级 AI 协作,让学术创作少走 90% 弯路
  • VSI bench介绍
  • 2026年最新《守望先锋2》下载与安装全指南:完整流程、配置优化与常见问题解析
  • 什么是大模型,智能体...?大模型100问,快速全面了解!
  • 宏智树 AI 破解文献综述困局:从 “文献堆砌” 到 “学术脉络深耕”
  • 2026高性价比AI语文课程大盘点!收费亲民+提分高效,家长闭眼入 - 品牌测评鉴赏家
  • 2026年最新小绿鲸英文文献阅读器下载与安装使用详解
  • 知识扩展-高精度空转(HD、Xenium、CosMx)banksy数据增强的意义
  • AI 人工智能领域,Claude 的优势凸显
  • 不用去桌球厅,这款3D桌球比玩真的还带感
  • 智能垃圾桶:AI Agent的自动分类系统
  • 数字营销的未来已来:Agentic AI技术全景解析
  • GJ504b 的 React 进阶之路:Day 3
  • 漏洞挖掘从入门到进阶(第三期)Web漏洞挖掘实战|XSS跨站脚本漏洞原理与绕过技巧
  • 牛只行为识别研究:基于YOLO13与UniRepLKNetBlock的智能分类系统_1
  • Rust 程序适配 OpenHarmony 实践:以 sd 器具为例
  • 【网络安全】我的故事:从“门外汉”到“守门人”
  • YOLO26涨点改进 | 全网独家首发,卷积创新改进篇 | TGRS 2025 | 引入MRCB多尺度感受野上下文提取模块,多种改进适用于复杂背景、小目标密集的红外或遥感图像目标检测场景,助力高效涨点
  • 【十叉树的先序遍历】字典序的第K小数字
  • 漏洞挖掘从入门到进阶(第一期)漏洞挖掘入门|定义、分类与标准化挖掘流程(附合法靶场清单)
  • TFTP(简单文件传输协议)
  • Flutter for OpenHarmony 实战:华容道游戏完整开发指南
  • 快速定位系统:实现空间精准感知的技术底座
  • YOLO26涨点改进 | 全网独家、特征融合创新篇 | TGRS 2026 | 引入MFPM多频感知融合模块,通过频率感知的判别过滤器,使融合特征“干净、聚焦”,适合红外、遥感小目标检测,有效涨点改进
  • 【收藏必备】率失真理论+最优传输:构建高质量教育知识图谱提升AI出题质量
  • 嵌入式编码器(Embedded Coder)
  • 学习笔记——Linux内核与嵌入式开发3
  • DeepSeek-OCR 2.0技术深度解析:AI如何模拟人类视觉逻辑,收藏级大模型架构创新
  • 收藏备用|零基础转型AI大模型,程序员小白必看四阶段学习路线图!