『dsu、Trie』Day8
可持久化并查集这玩意真的有用吗。?
upd on Sept:学了,不过就是按秩合并然后用可持久化数组分别存 fa 和 dep/siz。
Stamp Rally
kruskal 重构树板子,套上二分求一下祖先即可。
AND-MEX Walk
注意到答案只可能是 0,1,2。
因为 1 和 2 显然不能同时存在。
证明:可知边权序列不增,如果前面出现 2 则说明第 1 位是 0,由于是与运算所以不可能有 1 了。
判断 0 和 1 即可。
0 好判断,只要全不为 0,也就是最后一个数不为 0。那么必然有一位满足所有 \(w_i\) 在第 \(i\) 位都是 \(1\)。用 log 个并查集即可。
1 有点难。首先肯定保证会有一段 0 的后缀,不然答案是 0。那么前面的数都要 > 1。
所以只要有 1 位使得这些数都是 1,基本就符合条件了。
考虑这种情况,前面一堆 \(w=3\),中间有一个 \(w=1\),答案就不是 1 了。
所以还要保证,我们使用 1 ~ w 的位数去一直走,走到最后一个数后面是一个偶数,消除这种可能,这是容易的。
销售基因链
将字符串排序,可以在 trie 上找到给出的前缀对应的区间。
然后用可持久化 trie 找区间内这样的后缀有几个。
注意 trie 循环外面要更新 son。
另解:对前缀字典树节点重编号使得区间连续,在另一科树上合并 ds。
fusion tree
trick:01trie 支持全局加 1。
交换 01 子树,递归 1 子树即可。
trick:维护全局异或和。
每个点建一棵 trie,动态开点,每次可以加一个 pushup 维护信息。