[ARC101E] Ribbons on Tree 对于以 $x$ 为根的子树,如果 $(x,fa_x)$ 的边没有被覆盖,那么说明子树内没有任何一个点与子树外的点匹配。 把这些没有被覆盖的边看作特殊边,那么整棵树就被若干特殊边划分成了若干连通块。我们要求的是不含任何特殊边的匹配方案。 考虑容斥。钦定一个边集 $S$,表示 $S$ 内的边一定是特殊…
并查集是一个森林,每棵树表示一个集合,并且这个集合根据某种具有传递性的关系构建起来。 普通并查集关心的信息只有 $x$ 所在集合的根,$fa_x$ 表示的仅仅是一个传递性关系,即 $fa_x$ 与 $x$ 所在集合的根相同。从任意节点往上跳,都能找到它所在集合的根。 使用路径压缩优化,在向上访问节点时,把路径上所有节点的 $fa$ 都改为根,那么就…
图论这一块内容比较多,而且题目涉及的 Trick 也很多,因此分若干篇。 本文略去所有算法本身性质的证明过程。 最短路 Dijkstra和SPFA $\text{Dijkstra}$ 算法基于一个重要的性质:全局最小值不可能再被任何边更新。这样,在边权为非负数的最短路问题中显然满足,在存在负边时不满足。同时,保证了最多从每个节点处扩展 $1$ 次,…
luogu8551 Bassline 题目的限制翻译过来就是 $[x,y]$ 中任意位置都被覆盖了相同次数。 用差分求出每个点被覆盖的次数,双指针求极长的满足条件的位置即可。 #include<bits/stdc++.h> using namespace std; #define int long long #define uint u…
聊聊状态压缩。 顾名思义,就是把一个状态压成一个整数,从而使得问题的所有状态可以度量。 一般都是用二进制状态压缩来表示子集与全集的关系,对应着二进制每一位都是 $0$ 或 $1$。更高的进制能表示更多的信息,但状态的数量也会随之增加,并且实现的时候要自己手写位运算,较为复杂,本文不会涉及。 信息的表示 luogu7076 [CSP-S2020] 动…
搜索剪枝 纯搜索剪枝题很少,早就融入各种搜索之中了。 但是在各种多项式时间的搜索里,剪枝仍然是重要的。 目前只有一道题,以后看情况加。 luogu1120 小木棍 能注意到长度一定是所有木棍总和的倍数,并且至少是 $\max{a_i}$,所以只对这部分搜索就行。 设dfs(cnt,len,lst)表示当前还剩下 $cnt$ 根木棍要拼接,当前木棍剩…
专门放一些不大可能会考的计数题,长期更新。 大约是输入的只有问题规模,输出的只有相应方案数。 luogu6561 [SBCOI2020] 人 两两不相邻这个条件不是很容易搞。 考虑把 $[1,2m]$ 分成 $m$ 个数对,形如 $(\text{odd},\text{even})$,其中 $\text{odd} +1 =\text{even} $ …
计数杂题。 CF840C On the Bench 先进行一些基本的观察。 $\texttt{Observation}$ ${a_i}$ 中乘积为完全平方数的数集,一定是相对封闭的。因此我们可以将 ${a_i}$ 划分成若干个集合,满足其中两两乘积为完全平方数。 $\texttt{proof}$ 考虑和 $a_i$ 相乘为完全平方数的数集 ${a_…
满足「结合律」的静态信息 CF1175E Minimal Segment Cover 预处理 $rt_x$ 表示点 $x$ 经过一条线段能到达的最右边的点。 跳区间显然是满足结合律的,可以倍增之,复杂度 $O(n \log_2 n)$。 这类题目有一个重要的小技巧:为了满足最优性,倍增时跳到不能到达 $y$ 的最远的点 $p$,然后判断能一次跳过 …
多项式哈希 把元素看作数字,把哈希对象看作关于 $P$ 的多项式,得到多项式哈希,亦称为进制哈希。 主要用于有序对象的哈希。 一般使用unsigned long long自然溢出,相当于对 $2^{64}$ 取模。 关于 $P$ 的选取,尽量避免常用的大质数。下文统一使用1610612741,其在 $[2^{30},2^{31}]$ 中。 void…