尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

更为通用的决策单调性

更为通用的决策单调性
📅 发布时间:2026/6/19 23:58:12

学习自 在线决策单调性地皮还能单老哥分治做? - 洛谷专栏

决策单调性最为常用的为分治和二分队列,前者要求离线,后者必须快速处理两个位置的转移,都有一定的局限性,其他算法大部分码量较长,很难应用。

但我们还有一种好写且能维护复杂转移的写法, 简易版 LARSCH 算法,一种能够维护在线转移的分治做法。

丐版 LARSCH 算法

设我们要计算的 \(dp\) 数组为 \(f\) ,考虑如何通过分治维护出在线的转移,既然要求在线,如果在处理 \(i\) 之前能够处理出 \([1,i-1]\) 之间的所有 \(f\) 数组转移一定是正确的,但显然是无法做到的。但分治结构有一个特点,我们可以选择先递归左侧,再递归右侧,也就是对于分治区间 \([l,r]\) 我们能够保证 \([1,l]\) 的 \(f\) 值都是正确的。

我们考虑设计这样的一个 \(solve(l,r)\) 函数,我们要求 :

  1. \([1,l]\) 区间内的转移一定正确
  2. 只考虑 \([1,l]\) 内的值 \(r\) 的转移正确

\(mid\) 为 \(l,r\) 中点,\(p_l,p_r\) 为 \(l,r\) 当前的转移点,对于 \(solve(l,r)\) 我们依次进行下面的操作:

  1. 用 \([p_l,p_r]\) 的 \(f\) 更新 \(f_{mid}\)
  2. 递归处理 \(slove(l,mid)\)
  3. 用 \([l,mid]\) 的 \(f\) 更新 \(f_r\)
  4. 递归处理 \(slove(mid+1,r)\)

考虑这样操作的正确性,首先,由决策单调性可知,若只考虑 \([1,l]\) 的转移 \(p_{mid}\) 一定位于 \([p_l,p_r]\) ,那我们在递归 \(solve(l,mid)\) 时,依旧满足一开始的要求。处理完 \([l,mid]\) 之后,我们已经有了 \([0,mid]\) 的正确的 \(f\) 值,我们只要再用 \([l,mid]\) 对 \(r\) 进行转移,那在递归 \(solve(mid+1,r)\) 时依旧满足上述条件。如果我们递归到了叶子节点由定义可知,也就得到了 \([1,i-1]\) 到 \(i\) 的正确转移。

考虑时间复杂度,从一层来看所有拆分出来的区间 \([l,r]\) 的 \([p_l,p_r]\) 拼在一起一定构成一整个序列,每一层的时间也就是 \(O(n)\) 一共由 \(\log\) 层,总的时间杂度即为 \(O(n\log n)\)。而且我们的转移贡献可以用类似莫队的两个指针维护,总的移动次数也是 \(n\log n\) 的。

我们现在就得到了一个融合分治和二分队列两家之长的在线分治做法,完全可以平替前两者且较为好写。

Problem - 868F - Codeforces

应用的板子,可以看出真的很好写。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+10,inf=1e18;
int n,k,a[N],f[N][22];
struct nod{int L,R,ans,vis[N];void clear(){L=1,R=0;ans=0;for(int i=1;i<=n;i++)vis[i]=0;}int val(int l,int r){while(L<l){vis[a[L]]--;ans-=vis[a[L]];L++;}while(L>l){L--;ans+=vis[a[L]];vis[a[L]]++;}while(R>r){vis[a[R]]--;ans-=vis[a[R]];R--;}while(R<r){R++;ans+=vis[a[R]];vis[a[R]]++;}return ans;}
}S,T;
int trans1(int i,int j,int k){return f[i][k-1]+S.val(i+1,j);}
int trans2(int i,int j,int k){return f[i][k-1]+T.val(i+1,j);}
void slove(int l,int r,int L,int R,int k){if(l==r)return ;int mid=(l+r)>>1,I=0,J=0;for(int i=L;i<=R;i++){if(trans1(i,mid,k)<f[mid][k]){f[mid][k]=trans1(i,mid,k);I=i;}}slove(l,mid,L,I,k);for(int i=l;i<=mid;i++){if(trans2(i,r,k)<f[r][k]){f[r][k]=trans2(i,r,k);J=i;}}slove(mid+1,r,I,max(J,R),k);
}
signed main(){ios::sync_with_stdio(0);cin.tie(0); cout.tie(0);cin>>n>>k;for(int i=1;i<=n;i++)cin>>a[i];for(int i=1;i<=n;i++)for(int j=0;j<=k;j++)f[i][j]=inf;for(int i=1;i<=k;i++){S.clear();T.clear();slove(1,n,0,0,i);}cout<<f[n][k];return 0;
}

相关新闻

  • NOIP2025模拟赛19
  • C++ day7 - 指南
  • 读人形机器人11娱乐领域

最新新闻

  • 论文AI写作网址有哪些?精选6款正规平台推荐 - 掌桥科研-AI论文写作
  • 2026武汉三新高级技工学校招生简章,23个热门专业覆盖理工、艺术、医学、教育等六个学科方向 - 资讯速览
  • 2026升级耐用的顶管千斤顶 - 资讯速览
  • 2026年6月最新爱彼中国官方售后服务电话网点及客服中心地址 - 亨得利官方服务中心
  • Scout企业级AI合规部署:私有化、可审计、零外联实践指南
  • 印刷经营许可证丢了登报怎么线上办理?正规登报步骤大全 - 资讯速览

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号