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

分散层叠

其实并不是什么神秘的东西,而且相当不适用,原因是在某些问题下虽然理论最优但常数极大。

P6466 分散层叠算法(Fractional Cascading)

给出 \(k\) 个长度为 \(n\)有序数组

现在有 \(q\) 个查询 : 给出数 \(x\),分别求出每个数组中大于等于 \(x\) 的最小的数(非严格后继)。

若后继不存在,则定义为 \(0\)

对于 \(100\%\) 的数据,\(1 \leq k\leq 100\)\(2\leq n\leq 10^4\)\(q\leq 5\times 10^5\)


先考虑只有两个序列 \(a,b\) 的情况,我们可以把它们合成一个序列 \(c\) 然后在这个序列上二分。

找到了在 \(c\) 中的后继后,我们记它为 \(c_i\),我们考虑对序列 \(c\) 预处理出每个位置后首个在序列中出现的来自 \(a\)\(b\) 序列的数。

这样我们就可以 \(O(n)\) 预处理,然后每次只需要一次二分。

然后对于多序列的情况,这时我们假如直接合到一个序列中,序列长度是 \(nk\),做法会退化至 \(O(nk^2)\)

我们考虑嵌套上边的做法,我们先将数组 \(a_1,a_2\) 合并成序列 \(b_1\),对于序列 \(b\) 我们相邻两个数只保留一个,这样序列长度就是 \(n\),然后我们在根据二分结果查找是就需要跳两次。

我们考虑再讲 \(b_1\)\(a_3\) 合并成 \(b_2\),依次重复这样的操作我们就能得到 \(b_{k-1}\)

最终我们只需要二分一次,然后顺次推出每个序列的答案,这样复杂度降至单次 \(O(\log n+k)\)

P5356 [Ynoi Easy Round 2017] 由乃打扑克

所以她出了一个数据结构题。

给你一个长为 \(n\) 的序列 \(a\),需要支持 \(m\) 次操作,操作有两种:

  1. 查询区间 \([l,r]\) 的第 \(k\) 小值。
  2. 区间 \([l,r]\) 加上 \(k\)

\(1\leq l\leq r \leq n\leq 10^5\)\(1 \leq m \leq 10^5\)\(-2\times 10^4\leq a_i, k\leq 2\times 10^4\)\(opt \in \{1, 2\}\)


考虑朴素分块,取块长为 \(B\),每个块内维护块内数之间的升序排列。

对于修改操作,复杂度 \(O(B+\frac n B)\),对于查询,我们先将两边散块归并,然后二分答案,复杂度 \(O(\log V\log B+\frac {n\log B\log V} B)\),取 \(B=\sqrt {n\log V}\) 即可做到 \(O(n \sqrt n \log V)\),注意 \(\log\) 在外边。

我们考虑分散层叠优化,具体的,我们用线段树维护块之间的分散层叠结构,块的升序排列上层维护对于这 \(\frac n B\) 个块的线段树,对于线段树每个节点,我们维护左右两个儿子各取排列的 \(\frac 1 3\) 的归并。

对于修改,散块的复杂度是 \(O(B)\),在线段树上,复杂度是 \(O(B+\frac 2 3 B+\frac 4 9 B+\dots)≈O(B)\),于是修改复杂度降至 \(O(B)\)

对于查询,我们复杂度变为 \(O(\log V B+\log V\log B)\),取 \(B=\sqrt {n\log V}\) 就能做到 \(O(n\sqrt {n \log V})\)

P11721 [清华集训 2014] 玄学

在此题中,我们可以用类似分散层叠的结构优化。

我们最后的复杂度瓶颈在于线段树上的多结点二分,注意到对于每个结点,我们二分的数的取值均为其父节点的子集(父节点为两个子节点的归并),于是考虑类似分散层叠的优化。

考虑我们先在根节点二分,然后查询的时候将二分结果信息递归下传,这样二分只需要执行一次。

由于这个线段树需要支持在线插入末尾,所以还需要一些额外的实现细节。在此题中分散层叠优化效果比较显著,可以少一只 \(\log n\)


就具体实现效率而言,好像就魔法少女网站(luogu)(最简单的题(loj))等少数题实现效果较好,其余应用并不算太多,但可以作为一些少数多序列二分问题的优化,部分情况下使用较优。

http://www.jsqmd.com/news/355879/

相关文章:

  • 震撼!大数据Spark在不同场景下的应用
  • 【AUV】受AoI启发的AUV辅助水下物联网协作信息收集【含Matlab源码 15082期】复现含文献
  • 探索大数据领域ClickHouse的列式存储优势
  • UG NX 隐藏,反向隐藏,显示全部
  • python:用 Flask 3 , mistune 2 和 mermaid.min.js 10.9 来实现 Markdown 中 mermaid 图表的渲染
  • AI原生应用领域思维框架:推动技术融合的催化剂
  • UG NX 操作过滤器、选择过滤器
  • 检索模块
  • 【AUV】基于matlab受AoI启发的AUV辅助水下物联网协作信息收集【含Matlab源码 15082期】复现含文献
  • 2026激光切管机十大品牌权威排名 年度实力TOP10榜 - 匠言榜单
  • 警惕微信立减金回收陷阱,三招守护你的数字权益 - 京顺回收
  • IDEA离线安装插件
  • Q-learning基础
  • 【小程序毕设全套源码+文档】基于android的电子书阅读器系统的设计与实现(丰富项目+远程调试+讲解+定制)
  • 青岛华硕售后服务中心提供24小时维修服务 - damaigeo
  • 【小程序毕设源码分享】基于springboot+Android的多功能智能手机阅读APP的设计与实现(程序+文档+代码讲解+一条龙定制)
  • 突破时钟异步瓶颈!ISAC系统多目标多普勒频率估计新方案来袭【附python代码】
  • react native for OpenHarmony iconfont 图标不显示难题
  • 平衡树 Treap
  • 压力型白发哪家机构能治好?黑奥秘四大专利成分矩阵,精准解决白发根源
  • 模拟退火/随机化
  • 旅游管理系统|基于SpringBoot和Vue的旅游管理系统(源码+数据库+文档) - 详解
  • Base64 编码详解:原理、用途与实现
  • Zstandard(zstd)压缩算法及其使用
  • 消除FFmpeg库的SONAME依赖 - 实践
  • Python 文件读写
  • 文件上传与优化
  • 【小程序毕设全套源码+文档】基于Android的多功能智能手机阅读APP(丰富项目+远程调试+讲解+定制)
  • 【小程序毕设源码分享】基于springboot+android的电子书阅读器系统的设计与实现(程序+文档+代码讲解+一条龙定制)
  • 解析AI Agent架构在RK3588上的NPU/CPU/GPU映射,实现高效嵌入式AI部署