ST 表适合“边改边查”吗?
算法进阶 · 小纸条
选一章打印。双面打印(按长边翻页)后沿虚线剪开,每张卡片正面题目、背面答案。
f[i][0] 应初始化为什么?
为什么两个区间重叠也没关系?
判断 x、y 是否同组的依据是什么?
路径压缩把路径上节点的父亲改成了谁?
两棵高度相同的树合并后,新树的高度如何变化?
带权并查集里除 f[x] 外还需记录什么?
两点已在同一集合时,新关系用什么来判断真假?
想每次取最小值,该用大根堆还是小根堆?
堆 1 2 9 的最小合并总代价是多少?
参考答案(家长):a[i](长度为 1 的区间就是它自己)。
参考答案(家长):不适合,它针对不修改的静态数据。
参考答案(家长):find(x)==find(y)(根相同)。
参考答案(家长):最大值“可重复贡献”,同一元素算两次不改变结果。
参考答案(家长):加 1(作为新根的那棵秩要 +1)。
参考答案(家长):集合的根。
参考答案(家长):用它们的 d 差(相对权值)是否与新关系一致。
参考答案(家长):d[x],即 x 相对父亲的权值。
参考答案(家长):1+2=3,3+9=12,合计 15。
参考答案(家长):小根堆。
求第 k 大用小根堆还是大根堆来维护这 k 个元素?
两堆元素总数为奇数时,中位数在哪个堆顶?
归并 k 路时,堆里同时最多有几个元素?
普通 BST 最坏会退化成什么形状?
需要有序且允许重复,应该用哪个容器?
求集合中“第一个大于等于 x 的元素”,用哪个成员函数?
想只删除 multiset 中的一个 5,应传给 erase 什么?
值 {5, 1000000, 42} 离散化后分别映射成什么?
unique 之前必须先做什么?
用什么函数在有序表里找 v 的位置?
参考答案(家长):元素较多那个堆的堆顶。
参考答案(家长):小根堆(弹掉的是这 k 个里最小的)。
参考答案(家长):一条链(近似链表),操作变 O(n)。
参考答案(家长):k 个(每路各一个当前候选)。
参考答案(家长):lower_bound(x)。
参考答案(家长):multiset。
参考答案(家长):1、3、2(按从小到大的排名)。
参考答案(家长):传迭代器(find(5) 找到的那个),不要传值 5。
参考答案(家长):lower_bound(二分查找)。
参考答案(家长):排序(unique 只去除相邻的重复元素)。
求 1e9 值域的逆序对,为何要先离散化?
分块单次操作的典型复杂度是多少?
n=100,块大小取多少较合适?
l 和 r 落在同一块时怎么处理?
整块被区间加时,是逐个改元素还是打标记?
分块相比线段树,主要优点是什么?
“静态数组,只反复查区间最大值”,选哪个?
“信息可合并且需要区间修改”,一般会选什么?
线段树数组一般要开原长的几倍?
给“区间加 + 区间求和”和“滑动窗口最大值”各选一个最合适的工具。
参考答案(家长):O(√n)。
参考答案(家长):值域太大开不下树状数组,压缩到 O(n) 才能用。
参考答案(家长):直接暴力遍历这一段(不用整块汇总)。
参考答案(家长):约 10(√100)。
参考答案(家长):好写、通用性强(能维护更奇怪的信息)。
参考答案(家长):打块标记(延迟,O(1))。
参考答案(家长):线段树(带懒标记)。
参考答案(家长):ST 表(查询 O(1))。
参考答案(家长):前者用带懒标记的线段树;后者用单调队列。
参考答案(家长):4 倍(4n)。