XCPC 模板

XCPC 模板
amiracle基于 WIDA XCPC 模板,在此基础上对其补充和优化
图论
LCA 最近公共祖先
倍增 LCA
1 | vector<int> dep(n + 1), p(n + 1); |
HLD LCA
1 | // top 链顶点 , p 直接父亲 |
负权图最短路 (判负环)
Bellman-Ford O(n ⋅ m)
1 |
|
SPFA O(k ⋅ m)
1 |
|
Tarjan 求连通分量
点双连通分量
点双个数 & 每个点双的节点
1 | struct V_DCC { |
边双连通分量
边双个数 & 每个边双的节点
1 | struct EDCC { |
最大流-最小割
1 | template<typename T> |
数论
反演
子集反演
子集反演 莫比乌斯反演子集形式 加一个 (−1)|T|−|S| 的系数
超集和形式
f(S) : 发生的事件恰好是S g(T) : 至少覆盖T中的事件(超集)
f(S) : 发生的事件恰好是S g(T) : 发生T以内的事件(子集)
莫比乌斯反演
两个函数满足这样的整除 Σ 关系 f(x) = ∑d|xg(d)
二项反演(un)
加一个 (−1)n − i | (−1)i − k 系数
卷积
FFT 快速傅里叶变换
1 |
|
NTT 快速数论变换
取模版 FFT
1 |
|
2k 阶原根, 一般不需要找, 防止某些题奇葩模数
1 | // NTT 模数的 2^k 阶原根 |
FWT 快速沃尔什变换
O(nlog) 或者说 O(n2n) 计算 and | or | xor 卷积 (位运算卷积)
带模版
1 | // 1->正变换 0->逆变换 |
不带模版
1 | // n * A <= ll // 正变换后可能 int -> ll |
FMT 快速莫比乌斯变换
O(n2 ⋅ 2n) 子集卷积, 对于
1 |
|
预处理 - 逆元 - 组合数
O(n) 预处理 , O(1) 查询
1 | const int mo = 1e9 + 7; |
线筛
1 | vector<int> pri, mi_fct; |
极角排序(整数运算,无精度问题)
1 | ll cross(int x1, int y1, int x2, int y2){ // 两向量叉积 |
OTHER
min, max 绝对值的恒等式
曼哈顿转切比雪夫
平方和公式
组合数常用公式
- k ⋅ Cnk = n ⋅ Cn − 1 k − 1
- Cnk + Cnk + 1 = Cn + 1k + 1 (递推公式, 直接划分成两类)
(按选几个划分) (按最大值划分)
同余方程
ax ≡ r (mod p) 有 gcd (a, p) 个解,
也就是 a, p 互质时有唯一解, 可以直接 ap − 2 求逆元
n mod i = n -
数据结构
树状数组
1 | struct BIT{ |
DSU
1 | struct DSU{ |
ST表
1 | struct ST{ |
SegTree
区间修改|区间查询 通用结构
1 | struct SegTree{ |
区间加 (ai+v) | 区间和
1 | struct SegTree{ |
区间加 (ai+v) | 区间最值
1 | struct SegTree{ |
区间加 | 区间最值&个数
1 | struct SegTree{ |
区间乘 (ai*v) | 区间和
1 | struct SegTree{ // 0-idx |
区间最值更新 ( ai=max(ai, v) ) | 区间最值
1 | struct SegTree{ |
无区间修改 | 区间乘积
1 | struct SegTree{ |
矩阵 -> 单点修改 | 区间乘积
1 | template <const int M> |
可持久化线段树
1 | struct PresidentTree{ |
矩阵
来自 Masttf XCPC 板子
(+, x)
1 | constexpr int inf = 0x3f3f3f3f; |
(max, +)
1 | constexpr int inf = 0x3f3f3f3f; |
杂项
随机数生成
直接生成 64 位随机数
1 | ull seed = chrono::steady_clock::now().time_since_epoch().count(); |
[lo, hi] 范围随机数
1 | ull seed = chrono::steady_clock::now().time_since_epoch().count(); |
防卡hash
1 | // 防卡 hash |
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果













