高级堆与树状数组

共 18 题
#

1. 斐波那契堆的摊还分析中 extract-min 是 O(log n) 摊还、decrease-key 是 O(1) 摊还,势函数 Φ=t+2m 如何支撑这两个界?

A 两者都是 O(log n)
B extract-min 摊还 O(1),decrease-key 摊还 O(log n)
C extract-min 摊还 O(log n),decrease-key 摊还 O(1) ✓ 正确答案
D 势函数 Φ=t+2m 中 t 表示标记节点数
#

2. 动态中位数的双堆法中左大根堆+右小根堆能在 O(log n) 插入、O(1) 取中位数,两堆大小如何平衡与调整?

A 插入 O(1),取中位数 O(log n)
B 插入 O(log n),取中位数 O(1) ✓ 正确答案
C 插入和取中位数都是 O(log n)
D 两堆大小差可以任意大
#

3. 并查集的两种优化中为什么按秩合并保证树高 O(log n),路径压缩单独使用均摊 O(log n),两者结合得到反阿克曼 O(α(n))?

A 按秩合并一定比路径压缩更有效
B 路径压缩单独使用即可达到 O(α(n))
C 按秩合并保证树高 O(log n),与路径压缩结合后均摊 O(α(n)) ✓ 正确答案
D 两者结合后最坏情况仍是 O(n)
#

4. 主席树求静态区间第 k 小的过程中为什么查询要同时在 root[r] 与 root[l-1] 上做差分,每层 O(1) 比较、总复杂度 O(log n)?

A 查询需在 root[r] 与 root[l-1] 上同时下降做差分,每层 O(1),总 O(log n) ✓ 正确答案
B 只需在 root[r] 上下降即可
C 查询复杂度为 O(n log n)
D 不需要持久化,普通线段树即可
#

5. 可合并堆(左偏堆/斜堆/配对堆)的应用场景中为什么 Dijkstra/Prim 工程上仍常用二叉堆而不用斐波那契堆?

A 左偏堆的 merge 是 O(1)
B 斐波那契堆的 merge 操作是 O(1)
C 二叉堆的 decrease-key 是 O(1)
D 斐波那契堆理论最优但实现复杂、常数大,工程上 Dijkstra/Prim 仍常用二叉堆 ✓ 正确答案
#

6. 二项堆的结构与合并中二项树 B_k 的节点数恰为 2^k,合并两个二项堆如何用二进制加法类比做到 O(log n)?

A 二项堆中每阶数的树可以有多棵
B 二项树 B_k 的节点数为 k+1
C 合并二项堆需要 O(n) 次操作
D 二项树 B_k 的节点数为 2^k,堆结构与 n 的二进制表示对应 ✓ 正确答案
#

7. 树状数组与线段树的功能/复杂度对比中 BIT 代码短、常数小但仅支持前缀操作;线段树功能全但空间 4n、常数大

A BIT 代码短、常数小、空间 O(n),但比线段树功能受限 ✓ 正确答案
B 线段树空间为 O(n),与 BIT 相同
C BIT 支持任意区间操作
D 线段树常数比 BIT 更小
#

8. 二叉堆的建堆为什么是 O(n),自底向上 sift-down 的求和分析,与逐个插入 O(n log n) 的差异?

A 逐个插入建堆的复杂度是 O(n)
B 自底向上 sift-down 建堆的复杂度是 O(n log n)
C 自底向上 sift-down 建堆的复杂度是 O(n) ✓ 正确答案
D 建堆必须从第一个节点开始
#

9. Sparse Table 的 O(1) 查询中为什么取 min/max 是幂等(idempotent)操作所以区间可以重叠,而区间和不能这样预处理?

A Sparse Table 支持区间和查询
B 只有幂等操作(如 min/max)才能允许区间重叠,实现 O(1) 查询 ✓ 正确答案
C Sparse Table 支持动态修改
D 区间和也可以用重叠区间求值
#

10. 二叉堆、二项堆、斐波那契堆的复杂度对比中哪些操作在哪种堆上更优,工程上为何多用二叉堆?

A 二叉堆的 merge 是 O(1)
B 斐波那契堆的 decrease-key 与 merge 均摊 O(1),但常数大、实现复杂 ✓ 正确答案
C 二项堆的 extract-min 是 O(1)
D 斐波那契堆在实际中一定比二叉堆快
#

11. 树状数组如何实现区间加与区间求和,用两个 BIT(差分数组)推导查询公式的过程?

A 用两个 BIT 分别维护差分数组 d 与 i·d,即可 O(log n) 完成区间加与区间求和 ✓ 正确答案
B 单用一个 BIT 即可同时支持区间加与区间求和
C 区间加只能在线段树上实现
D 区间求和的公式是 Σ d[j] 即可
#

12. 线段树与树状数组的互相转化中哪些区间操作(区间加、区间最值)只能用线段树?

A BIT 可以任意区间求最值
B 区间最值(如区间加后求区间最大)只能用线段树,BIT 无法直接实现 ✓ 正确答案
C 区间加与区间求和必须用线段树
D BIT 的功能完全覆盖线段树
#

13. Treap 的期望深度中随机优先级使 Treap 等价于随机 BST,期望高度 O(log n) 如何由随机 BST 分析得到?

A 随机优先级使 Treap 等价于随机 BST,期望深度 O(log n) ✓ 正确答案
B 随机优先级使 Treap 期望深度 O(n)
C 优先级固定时 Treap 仍期望 O(log n)
D Treap 需要显式维护平衡因子
#

14. Link-Cut Tree 的 access 操作中虚实链切换需要 splay 与路径聚合,access 的摊还复杂度 O(log n) 如何由 splay 势能证明?

A access 通过 splay 与虚实切换把根到 u 的路径聚合为实链,摊还 O(log n) ✓ 正确答案
B access 每次都需要重建整棵树
C splay 的均摊复杂度是 O(n)
D access 不涉及虚实链切换
#

15. 线段树懒标记(Lazy Propagation)的原理中延迟下推区间更新标记,仅在需要访问子节点时才 push_down,保证 O(log n) 单次更新

A 每次区间更新都要下推到所有叶子
B 完全覆盖的区间直接更新并打标记,仅需要时 push_down,单次更新 O(log n) ✓ 正确答案
C 懒标记使单次区间更新复杂度为 O(n)
D push_down 每次更新都执行
#

16. 可持久化线段树的版本共享中为什么修改只新建 O(log n) 个节点、旧版本节点不被改动就能保证历史查询正确?

A 旧版本节点会被修改以同步新版本
B 每次修改都要复制整棵树
C 修改只新建 O(log n) 个节点,旧版本节点不可变,历史查询正确 ✓ 正确答案
D 无法进行历史查询
#

17. 树状数组(Fenwick Tree)的 lowbit 设计与前缀查询/单点更新,与线段树的适用边界?

A lowbit(i) 等于 i 的最高位
B 节点 i 覆盖 [1, i]
C BIT 可以直接支持任意区间最值查询
D 节点 i 覆盖 [i-lowbit(i)+1, i],前缀查询与单点更新均 O(log n) ✓ 正确答案
#

18. Top Tree 与 LCT 的对比中竞赛中的动态树问题多用 LCT 或树链剖分,Top Tree 的 cluster 抽象何时才值得实现?

A LCT 只能处理静态树
B Top Tree 的实现比 LCT 简单
C 树链剖分支持动态 link/cut
D 竞赛动态树问题多用 LCT 或树链剖分,Top Tree 的 cluster 抽象实现复杂,仅在需高级聚合时使用 ✓ 正确答案