已完成今日 簡易版 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);
}