计算几何 - 凸包
凸包的定义是能包含住所有点的凸多边形的交集,通过 Andrew 算法可以在 O(nlog(n)) 排序后用栈线性维护上下凸包,从而求出所有在凸包上的点,或者用平衡树动态维护凸包。
计算几何 - 向量
通过向量之间的运算可以判断出点与直线的位置关系,主要使用叉积判断点在直线的哪一侧。
计算几何 - 自适应辛普森积分法
辛普森积分法是一种求数值积分的方法,用二次函数拟合被积函数达到较好的效果,还可以通过分治自适应地保证精度。本文也比较详细地记录了辛普森积分法误差的推导过程。
数学 - Pollard Rho
Pollard Rho 算法利用生日悖论,可以在优秀的复杂度内找到一个合数的非 1 非自身因数,使用时需要搭配 Miller Rabin 算法首先判断一个数是否为质数。
数学 - Miller Rabin
Miller Rabin 算法是一种用来快速判断一个数是否为质数的随机化算法,当数字选择恰当时可以保证在 uint64 范围内准确。
数学 - 二次剩余
二次剩余即模意义开根,当模数为奇素数时,用 Cipolla 算法利用扩域的思想进行求解。
数学 - BSGS
BSGS 算法即大步小步算法是利用分块与哈希表,在根号的复杂度求解离散对数问题的算法。
杂项 - 主定理及证明
分析递归的时间复杂度时通常需要用到主定理,我之前一直当作黑盒去用它,但是越来越想了解一下这个定理是如何证明的,发现证明过程只用到了等比级数与对数的相关公式,这里记录一下。
杂项 - CDQ 分治
CDQ 分治是一种用来解决点对相关问题的思想,可以让一个偏序条件变成 0/1 条件,最终将满足一个条件元素的贡献到满足另一个条件的答案中,从而达到降低问题维度的目的。
数据结构 - 左偏树
左偏树是一种二叉树,它具有堆的性质,支持动态合并两颗左偏树,保持新树仍然满足左偏树的性质,并且合并两颗树的复杂度是 O(log(n)),同时用并查集维护堆顶,不会增加复杂度。