08 2022 档案
摘要:启发式合并 定义 一个基于直观或经验构造的算法,在可接受的花费(指计算时间和空间)下给出待解决组合优化问题每一个实例的一个可行解,该可行解与最优解的偏离程度一般不能被预计。 举个栗子:并查集的按秩合并。 每次我们将大集合合并到小集合里,新集合至少为大集合的两倍,每次合并都会变大为两倍,每个元素至多经
阅读全文
摘要:前置知识 lowbit 求出最后一个二进制中最后一个1在什么位置 int lowbit(int x) { return x & (-x); } 原理:原码 & 补码 例如:11 & (-11) 11原码: 0000 1011 -11原码: 1000 1011 -11反码: 1111 0100 -11
阅读全文
摘要:简介 常用来维护区间信息的数据结构,可以在的时间内实现区间修改,区间信息合并,单点修改。 结构 建树 注意:线段树空间需要开到四倍。 struct Node { int minv; } seg[N * 4]; // 根据左右儿子更新父亲节点信息 void update(int id
阅读全文
摘要:倍增 定义 倍增法,顾名思义就是翻倍. 它能够使线性的处理转化为对数级的处理,大大地优化时间复杂度 这个方法在很多算法中均有应用,其中最常用的是 RMQ 问题和求LCA,无修改的路径信息。 路径最小值 注意:路径上的信息需要可以合并,例如求最值 const int N = 201000; const
阅读全文
摘要:KMP 代码实现 时间复杂度 int n, m; int next[M + 1], f[N + 1]; char s[N + 2], p[M + 2]; void kmp() { n = strlen(s + 1), m = strlen(p + 1); int j = 0; n
阅读全文
摘要:相关定义 二分图(偶图)是一种无向图:其中的顶点可以分为两个交集为空的集合X和Y,对于途中的每条边,其中一个端点在X中,另一个端点在Y中,且X和Y内部顶点之间没有边。 完全二分图:集合X和Y每对顶点之间有且仅有一条边的图,记作,n和m分别为X和Y集合中的顶点个数。 匹配:任意两条边
阅读全文
摘要:定义 树链剖分用于将树分割成若干条链的形式,以维护树上路径的信息。 具体来说,将整棵树剖分为若干条链,使它组合成线性结构,然后用其他的数据结构维护信息。 树链剖分(树剖/链剖)有多种形式,如 重链剖分,长链剖分 和用于 Link/cut Tree 的剖分(有时被称作“实链剖分”),大多数情况下(没有
阅读全文