摘要:
启发式合并 定义 一个基于直观或经验构造的算法,在可接受的花费(指计算时间和空间)下给出待解决组合优化问题每一个实例的一个可行解,该可行解与最优解的偏离程度一般不能被预计。 举个栗子:并查集的按秩合并。 每次我们将大集合合并到小集合里,新集合至少为大集合的两倍,每次合并都会变大为两倍,每个元素至多经 阅读全文
摘要:
前置知识 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集合中的顶点个数。 匹配:任意两条边 阅读全文