摘要:
最小链覆盖 (最长反链) 最小链覆盖 \(=n-\) 最大匹配。 考虑首先每个点自成一条链,此时恰好有 \(n\) 条链,最终答案一定是合并(首尾相接)若干条链形成的。 将两点匹配的含义其实就是将链合并。 说明 Dilworth 定理:一个偏序集中的最长反链大小,等于其中最小不可重链覆盖大小。 对于 阅读全文
摘要:
该算法的一大判断依据,DP 不可做 or 状态高,数据范围适合网络流。 最大流 Dinic 的实现 int S, T, ecnt = 1, head[N], cur[N], dep[N]; struct edge{ int nx, to, v; } e[M * 2]; inline void add 阅读全文
摘要:
线段树的应用 很多可以支持合并的信息都可以维护,如 树的区间直径。 阅读全文
摘要:
一种可以 高效处理 \(k\) 维空间信息 的数据结构。 在正确使用的情况下,复杂度为 \(O(n^{1-\frac{1}{k}})\). K-D Tree 的实现 建树 随机一维选择最中间的点为当前子树的根,每个节点维护当前点的坐标,已经整个子树的矩形坐标。 Pink Rabbit 说随机选维度没 阅读全文
摘要:
Hash 的思想 Hash 的核心思想在于,将输入映射到一个值域较小、可以方便比较的范围。 这里的 “值域较小” 在不同情况下意义不同。 在哈希表中,值域需要小到能够接受线性的空间与时间复杂度。 在字符串哈希中,值域需要小到能够快速比较。 同时,为了降低哈希冲突率,值域也不能太小。 Hash 的实现 阅读全文
摘要:
实现 void ins(int c){ int np = ++dcnt, p = lst; lst = np; t[np].len = t[p].len + 1, t[np].eps = 1; while(p && !t[p].ch[c]) t[p].ch[c] = np, p = t[p].fa; 阅读全文