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

猫树分治

猫树分治,又称二区间合并,一种可以用 \(O(n\log n)\) 时空复杂度预处理,\(O(1)\) 处理区间询问的算法,与 cdq 和整体二分类似。

我们考虑线段树上,我们通过 pushup 操作不断合并两个区间,做到查询 \(O(\log n)\) 个区间回答询问,但是如果没有修改操作,我们可以只询问 \(O(1)\) 个区间来回答询问。

即,我们需要找到一个区间,使得其包含我们整个询问区间,且中点落在询问区间内。考虑堆式建树,\(i\) 的左儿子是 \(2i\),右儿子是 \(2i+1\),那么显然我们要找到的是 \([l,l]\)\([r,r]\) 在树上的 \(\text{LCA}\),而如何求出 \(\text{LCA}\) 呢。

因为采用了堆式建树,记 \([l,l]\) 编号为 \(x\)\([r,r]\) 编号为 \(y\),那么其 \(LCA\) 编号为 x >> log[x^y],此处 log 数组的定义在 \(1\) 处为 \(1\)

其实,在可以离线的问题中我们完全可以类似整体二分,将询问不断分组来找中点也可以。

之后,我们找到了这个大区间,那么我们其实只要预处理出从区间中点出发向左向右的前后缀答案,再做拼接即可,这也要求问题需要有可加性,比如区间最大子段和,\(\{\max,+\}\) 卷积之类的。

P6240 好吃的题目

给定价值和代价序列,\(q\) 次询问,给定 l r t,查询区间 01 背包上限为 \(t\) 的答案。
\(1 \le n \le 4\times 10^4\),\(1 \le q \le 2\times 10^5,1 \le h_i,t \le 200,1\le w_i \le 10^7\)

发现 01 背包形如 \(\max \{ f_i + f_{t-i}\}\),即 \(\{\max,+\}\) 卷积,满足区间可加性,直接猫树分治,每次对 \((mid,r]\) 处理前缀背包答案,\([l,mid]\) 处理后缀背包答案,查询时 \(O(t)\) 将两侧背包答案拼接即可。

总复杂度 \(O(nt\log n + qt)\),跑到了最优解第一页。

const ll N=4e4+5,M=205,T=2e5+5;
ll n,m,h[N],w[N],f[N][M],ans[T],l,r,t,V;vector<tuple<ll,ll,ll,ll>> Q;
inline void solve(ll l,ll r,vector<tuple<ll,ll,ll,ll>> &Q)
{if(!Q.size()) return;ll mid=l+r>>1;fo(0,j,V) f[mid][j]=0;fo(mid+1,i,r){fo(0,j,h[i]-1) f[i][j]=f[i-1][j];fo(h[i],j,V) f[i][j]=max(f[i-1][j],f[i-1][j-h[i]]+w[i]);} fo(h[mid],j,V) f[mid][j]=w[mid];Fo(mid-1,i,l){fo(0,j,h[i]-1) f[i][j]=f[i+1][j];fo(h[i],j,V) f[i][j]=max(f[i+1][j],f[i+1][j-h[i]]+w[i]);}vector<tuple<ll,ll,ll,ll>> A,B;for(auto [l,r,lim,id]:Q){if(r<=mid) A.pb({l,r,lim,id});else if(l>mid) B.pb({l,r,lim,id});else fo(0,i,lim) ckmx(ans[id],f[l][i]+f[r][lim-i]);}Q.clear(),solve(l,mid,A),solve(mid+1,r,B);
}
signed main(){read(n,m);fo(1,i,n) read(h[i]);fo(1,i,n) read(w[i]);fo(1,i,m){read(l,r,t);if(l==r) ans[i]=(t>=h[l]?w[l]:0ll);else ckmx(V,t),Q.pb({l,r,t,i});}solve(1,n,Q);fo(1,i,m) wr(ans[i]),pr;return 0;
}
http://www.zskr.cn/news/3178.html

相关文章:

  • AI导航生成寻路点-FindPathToLocationSynchronously
  • 智聘无界:AI 破解全球化招聘合规、成本与人才匹配难题的实践路径
  • Flink 与Flink可视化平台StreamPark教程(CDC功能)
  • GAS_Aura-Setting Up Auto Running
  • 源码调试-带你了解下车牌识别的深度学习模型-LPRNet
  • charles破解-在线生成激活码
  • 内部排序-直接插入排序冒泡排序快速排序对比
  • C++ auto关键字
  • ARM主板:低功耗高性能的嵌入式计算核心
  • Gin 模板系统深度解析:客服系统实战开发
  • 系统盘爆了,.vscode,.android占内存太多,使用mklink命令符号链接
  • Acrobat Pro DC 2025下载及破解安装教程,附永久免费免激活中文破解版Acrobat Pro DC安装包(稳定版)
  • 2025绩效管理必知
  • Laravel APP_DEBUG=true:存在账户信息泄露风险
  • 在Proxmox中部署Security Onion的安全配置实战
  • 报表到 BI:企业数据从展示到决策的进阶之路
  • Flink 与Flink可视化平台StreamPark教程(DataStreamApi基本使用)
  • 内部排序-直接插入排序
  • Linux:龙晰系统(Anolis)更新yum(dnf)仓库源
  • 研究生-必看-倒计时3天/武汉科技大学主办/稳定EI会议/高层次教授出席报告
  • LGP7113 [NOIP 2020] 排水系统 学习笔记
  • SQL Server 2022 RTM 累积更新 #21 发布
  • 微算法科技(NASDAQ: MLGO)开发Rollup技术,探索区块链扩展性解决方案
  • Docker:龙晰系统(Anolis)更新yum源下载docker
  • 针对单输入单输出、多输入多输出及三阶系统带约束的模型预测控制的实现
  • 读书笔记:数据库索引的智能优化:反向键与降序索引
  • 故障处理:access$表在数据库丢失的恢复
  • C++ - STL - 迭代器
  • 在GA中添加Tag-GetDynamicSpecSourceTags().AddTag(NewTag)
  • 296、贾生