📘 DAY 01
并查集 · ST表 · LCA
CSP 暑期集训 · 数据结构与倍增专题
并查集回顾
路径压缩 / 按秩合并 / 敌人关系
ST表与倍增
RMQ问题 · O(nlogn)预处理 · O(1)查询
LCA倍增求法
最近公共祖先 · 树上倍增
fa[x] 数组表示:x 的父亲节点fa[x] == x,说明 x 是根节点(代表元素)fx,找到 y 的根 fy,让 fa[fx] = fy(合并两棵树)
rnk[x] 记录 x 为根的树的高度(秩)1 x y:合并 x 和 y 所在的集合2 x y:查询 x 和 y 是否在同一集合,输出 "Y" 或 "N"
unite(x, y)find(x) == find(y)| j | 区间长度 | st[j][1] | st[j][2] | st[j][3] | st[j][4] | ... |
|---|---|---|---|---|---|---|
| 0 | 1 | a[1] | a[2] | a[3] | a[4] | ... |
| 1 | 2 | max(a[1..2]) | max(a[2..3]) | max(a[3..4]) | max(a[4..5]) | ... |
| 2 | 4 | max(a[1..4]) | max(a[2..5]) | max(a[3..6]) | max(a[4..7]) | ... |
| 3 | 8 | max(a[1..8]) | - | - | - | ... |
fa[k][u],查询时大步跳、小步调,O(log n) 完成一次 LCA 查询。
fa[1..n]:表示每个动物自己的集合fa[n+1..2n]:表示每个动物的"敌人集合"fa[1..n]:同类集合fa[n+1..2n]:被捕食者集合(被"我"吃的)fa[2n+1..3n]:捕食者集合(吃"我"的)