2024.10.24 鲜花
多次查询给定集合是否存在任一给定子集
Re:End of a Dream
给定 \(n\) 个集合 \(S_n\) ,\(q\) 组询问,每次给定一个集合 \(Q\),判断其是否包含一个集合 \(S_i\)。
先考虑经典例题 DZY Loves Chinese II
考虑其做法:随机赋值非树边,用返祖边来平衡使其权值为 \(0\),线性基维护。
考虑扩展,发现集合中并不存在一个唯一元素用来平衡,考虑在每个集合中加入一个元素来平衡。
这样单次查询前要加入每个集合的独立元素,就是 \(O(集合大小+子集个数)\) 的,并没有达到输入下限,考虑用可撤销线性基维护,每次就不用加入独立元素了,总复杂度是 \(O(\sum 子集大小+q\times 集合大小)\)。
好像 wang54321 有更巧妙的做法,但我和 TA 都忘了,就先这样吧,复杂度是一样的。
P
本文来自博客园,作者:xrlong,转载请注明原文链接:https://www.cnblogs.com/xrlong/p/18497905
版权声明:本作品采用 「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0) 进行许可。