随笔分类 - 算法
线段树优化建图
摘要:使用场景 单点向区间、区间向单点,区间向区间建边 实现原理 用线段树的一个节点管辖一段图上区间的顶点 实现步骤 将原图中的顶点拆点,出点和入点; 建立两棵线段树,出点的树 ,入点的树 ; 出点的树由子节点连向父节点,边权为 ,入点的树由父节点向子节点连边,边权
【计算几何】极角排序
摘要:前置知识 三角函数。 引文 给定一个中心点 与 个点,求按点与 的连线与 轴的夹角排序后的点对。 正文 显而易见,不论我们如何移动 点, 点对都是不变的,所以,化难为简,索性将 点直接移动到原点上, 然后同过三角函数,我们可以算出这个角度, 直接调用
【计算几何】基础知识
摘要:前置知识点 (1) ; (2) 余弦定理 浮点数的比较 const double eps = 1e-8; int sign(double x) // 符号函数 { if (fabs(x) < eps) retu
【线段树】线段树合并
摘要:使用场景 有多棵线段树,维护相同的区间 [1,n] ,通常是全职线段树, 每一棵线段树维护了区间内的最大值(区间元素和), 次单点修改,每次修改一棵线段树的位置为 的值, 次修改之后,所有线段树对应区间位置的权值相加,并维护区间最大值。 代码 inline int mer
【线段树】动态开点
摘要:使用场景 维护的区间太大以至于 存不下,通常是权值线段树; 维护的区间下标存在负数; 时间复杂度 全部开点,则 每递归一次,最多开点 ,若调用 次, 原理 若一段子区间 [L,R] 对应的线段树节点为 cur
【计算几何】浅谈凸包Andrew算法
摘要:前置知识 计算几何基础知识。 引文 这样一个问题, 有许多个杆子,需要用绳子围住所有的杆子,然鹅没有很多的绳子,求最短需要多少绳子。 整个图大概是这样的, 正文 我们要如何解决这题呢?不难想出,最优解法应该是这样的, 而这个图中隐藏着解决这道题的奥秘。 特别的这个图被我们称为凸包。 首先我们可以把它
【计算几何】全代码
摘要:const double eps = 1e-7; const double pi = acos(-1); int dcmp(double x) { // 判负 return (fabs(x) <= eps) ? 0 : (x < 0 ? -1 : 1); } struct Point { // 点
【图论】浅谈JohnSon全源最短路
摘要:## 前置知识 SPFA、Dijkstra. ## 引文 先是给一道题目: ``` 给定一个包含 n 个结点和 m 条带权边的有向图,求所有点对间的最短路径长度,一条路径的长度定义为这条路径上所有边的权值和。 ``` 看到最短路,你也许会想到最短路; 然而发现它居然会有负边,也就是说可能会有负环,你
【字符串】AC自动机
摘要:使用场景 多模式串匹配问题 Fail 数组 数组是 AC 自动机较为重要的一部分, 与 KMP 中 数组的地位相似, 但是 数组具体是用来干什么的呢, 打个比方,你有两个字符串,分别为 SheAKioi 、 AKioi 、 heioi 、 noi, 特别的第一