真神仙题。
做法一
使用 bitset 优化暴力,对权值开 bitset,匹配时直接或起来即可。
注意到空间很大,可以通过根号分治优化,时间复杂度大概在 $O(\sqrt{\frac{n^3m}{\omega}})$。
做法二
这个容斥是真的 NB。
判断两个集合是否重合的一个方法:枚举两个集合的子集,长度为奇数的子集相同就加一,为偶数的子集相同就减一,最终若有相等元素,则最终值一定为 $1$。
证明:令 $s$ 为交集大小,则我们所求值为 $\sum\limits_{i=1}^{s}\dbinom{i}{s}(-1)^{i+1}$,由二项式定理可以推导得到。
这个方法看似时间复杂度很劣,但是在这道题中有奇用,我们可以用他来判断若干集合中于一个集合有相同元素的集合个数。
具体的,我们把这区间中的子集全部求出来,使用哈希表/Trie等数据结构记录个数,然后做上面的东西即可,最终得到的答案即为有相同元素的集合个数,可以在 $O(m2^m)$ 的时间复杂度内得出。
本题中,最开始我们将所有集合按 $w$ 排序,找到最前面的一个 $r$,和相应的 $l$,然后我们将 $r$ 右移,此时贪心地想,$l$ 必须向左移,具体将 $l$ 左移时删去他的子集,如果此时与 $r$ 相交集合减少,则说明 $l$ 和 $r$ 无交集,更新答案。
由于 $l$ 和 $r$ 单调,最终时间复杂度为 $O(nm2^m)$。