已完成今日 簡易版 LARSCH Algorithm 大学习
满足决策单调性的 dp 的优化。
离线:。
在线:。
可能的做法:
分治 ,离线,,下标访问连续,支持类莫队计算贡献。
二分队列,在线,。
SMAWK,离线,。
以多一个 的代价 cdq 分治,将分治或 SMAWK 转为处理在线问题。
简易版 LARSCH 算法
基于魔改的分治,可以在线, ,支持类莫队计算贡献,常数小,码量小。
分治 ,要求:
- 进入时已经算完 ,已经得到 只考虑 的决策点。
- 离开时算完 。
设 表示当前已知信息下的决策点。
- 用 更新 ,因为 ,此时 和 都表示只考虑 的决策点。
- 递归 ,进入递归时符合要求。
- 用 更新 ,此时 表示只考虑 的决策点。
- 递归 ,进入递归时符合要求。
在递归到 时结束,此时 已经考虑了 的更新。
莫队的指针移动,两种移动分别做的话,每层 。
整个代码写起来和普通基本一样。
code
struct ds{
int l,r,ans;
ds(){l=1,r=0;}
ll que(int ql,int qr){
while(r<qr)r++;
while(l>ql)l--;
while(r>qr)r--;
while(l<ql)l++;
return ans;
}
}a[2];
void upd(int j,int i,int op){
int nw=dp[j-1]+a[op].que(j,i)+w;
if(nw<dp[i])dp[i]=nw,p[i]=j;
}
void sovle(int l,int r){
if(l==r)return ;
int mid=l+r>>1;
for(int i=p[l];i<=p[r];i++)upd(i,mid,0);
sovle(l,mid);
for(int i=l;i<=mid;i++)upd(i,r,1);
sovle(mid+1,r);
}