减少地皮码量,重铸 Larsch 荣光
卡帕瓦_KAPawa · · 算法·理论
其他对于此算法的介绍/文章:
在线决策单调性地皮还能单老哥分治做?
OIwiki
update on 2026/4/15:修改了某些 larsch 打成 larcsh 的笔误。
1.算法介绍
众所周知啊,一个具有决策单调性的 DP,它是有很多实现方法的,比如二分队列大家应该都会写吧。但是经过后人的总结,我们发现二分队列的码量还是有一点大了,它还可以做的更简洁。
于是出现了一个新科技——在线决策单调性 DP 单 log 分治,也叫简化版 Larsch 算法。
它的优点是:可以处理半在线 DP 转移,码量小,常数也极小。
先说说什么是在线。设
对于一个具有决策单调性的 DP,如果它的转移系数为
也就是说,
而半在线的转移系数不为
也就是说,
那么 larsch 是如何实现的呢?下面是我的见解:
以下该算法解决的问题为
要实现这个算法,我们要设计一个函数
考虑一下正确性。如果我们能保证刚才那些成立,那么递归到最后一层
然后考虑实现方法。假设当前进行到了
容易发现时间复杂度是
2.实现细节
接下来来到我真正想说的环节了(bushi),因为感觉大家或多或少都听说过这个算法却没写过。这个算法的唯一缺点就是边界情况不太好判断。就写了俩题,我踩了
:::epigraph[——卡帕瓦_KAPawa] 世界上最绝望的五个字是——“找不到差异”。 :::
易错点一:
首先,因为
以下是实现参考。
:::info[不需考虑
inline ll w(ll j,ll i){
if(j==0) return inf;
//else ...
}
inline void check(ll j,ll i){
if(w(j,i)>f[i]) f[i]=w(j,i),p[i]=j;
return;
}
inline void larsch(ll l,ll r){
//...
return;
}
inline void work(){
for(int i=0;i<=n;i++) p[i]=0,f[i]=-inf;
//check(1,1);
check(1,n);
//check(n,n);
larsch(1,n);
return;
}
:::
:::info[需要考虑
inline ld w(ll j,ll i){
//return ...
}
inline void check(ll j,ll i){
if(w(j,i)>f[i]) f[i]=w(j,i),p[i]=j;
return;
}
inline void larsch(ll l,ll r){
//...
return;
}
inline void work(){
for(int i=0;i<=n;i++) p[i]=0,f[i]=-inf;
check(0,1);
check(0,n);
check(1,n);
larsch(1,n);
return;
}
:::
易错点二:
容易发现,我上面的第一个代码中,出现了注释掉的 check(1,1) 以及 check(n,n)。这是怎么一回事呢?因为有些题目比较特殊,larsch 在递归到最后一层的时候,要写一个这个。
:::info[这个]
inline void larsch(ll l,ll r){
if(l+1==r){
check(r,r);
return;
}
}
:::
而如果没有这种情况的出现,只需要写那个就可以了。
:::info[那个]
inline void larsch(ll l,ll r){
if(l+1==r) return;
}
:::
下面是一般情况实现参考。
:::success[代码]
inline void check(ll j,ll i){
if(w(j,i)>f[i]) f[i]=w(j,i),p[i]=j;
return;
}
inline void larsch(ll l,ll r){
if(r==l+1){
//check(r,r);
return;
}
ll mid=(l+r)>>1;
for(int j=p[l];j<=p[r];j++) check(j,mid);
larsch(l,mid);
for(int j=l+1;j<=mid;j++) check(j,r);
larsch(mid,r);
return;
}
inline void work(){
for(int i=0;i<=n;i++) p[i]=0,f[i]=-inf;
//check(1,1);
//check(0,0);
//check(0,1);
//check(0,n);
check(1,n);
//check(n,n);
larsch(1,n);
return;
}
:::
和二分队列的代码一对比,就能看出来码量优势了。虽然不一定短了多少,但是清晰了不少。在这道题中,larsch 直接进入了最优解第二页开头(减去套数据