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

posted @ 2024-10-24 06:42  xrlong  阅读(42)  评论(2编辑  收藏  举报