- B1: 前缀和与差分
- B2: 快速组合
- B3: 二分查找
- B4: 高精度加法
- B4: 高精度除法
- B4: 高精度乘法
- B4: 高精度减法
- D1: 单调栈
- D2: 单调队列
- D3: Spare Table
- D4: 字典树
- D5: 并查集
- D6: 树状数组-限定区间计数
- D6: 树状数组-单点更新区间求和
- D7: 线段树-基础
- G1: 二分图-判定
- G2: 二分图-最大匹配
- G3: Astar k短路 on matrix
- G4: 拓扑排序
- G5: 连通无环无向图的重心
- G6: MST-Kruskal
- G7: MST-Prim
- G8: ShortestPath-BellmanFord
- G9: ShortestPath-Dijkstra
- G9: ShortestPath-Dijkstra Heap OPT
- G10: ShortestPath-SPFA
- G11: ShortestPath-Floyd
- M1: 快速幂与龟速乘
- M2: 欧几里得-最大公约数
- M2: EX欧几里得-翡蜀定理
- M2: EX欧几里得-线性同余方程
- M2: EX欧几里得-乘法逆元
- M3: 费马小定理-乘法逆元
- M4: 分解质因数
- M4: 分解质因数-欧拉函数
- M4: 分解质因数-多数乘积约数计数
- M4: 分解质因数-多数乘积约数求和
- M5: 欧拉筛
- M5: 欧拉筛-质数筛
- M6: 埃氏筛-质数筛
- M7: Stein算法-最大公约数
- M8: 矩阵乘法与快速幂
- O1: 快速排序
- O2: 并归排序
- S1: KMP
- S2: 字符串哈希
This doc has been marked needs-review. Following information are in upcoming update plan.
template< class type >
class SegTree {
struct node {int l, r; type v; } tr[maxn << 2u];
void pushup(int u) { tr[u].v = max(tr[u << 1u].v, tr[u << 1u | 1u].v); }
void build(int u, int l, int r) {
tr[u] = {l, r};
if (l == r - 1) {
// init tr[u].v with ar[l]'s attribute
return ;
}
build(u << 1u, l, (l + r) >> 1u);
build(u << 1u | 1u, (l + r) >> 1u, r);
pushup(u);
}
type query(int u, int l, int r) {
if (tr[u].l >= l && tr[u].r <= r) return tr[u].v;
if (tr[u].l >= r || tr[u].r <= l) return 0;
return max(query(u << 1u, l, r), query(u << 1u | 1u, l, r));
}
void modify(int u, int id, int x) {
if (tr[u].l == id && tr[u].r - 1 == id) tr[u].v = x;
else {
int mid = (tr[u].l + tr[u].r) >> 1u;
if (id < mid) modify(u << 1u, id, x);
else modify(u << 1u | 1u, id, x);
pushup(u);
}
}
public:
void init(const int n) { build(1, 1, n + 1); }
type solve(int l, int r) { return query(1, l, r + 1); }
void update(int id, int x) { modify(1, id, x); }
};
SegTree< int > st;