高维前缀和优化容斥小技巧

现有m个点集(V_{1...m}),设这m个点集所组成的集合(U={V_{1...m}}),先要对于每个集合(Ssubseteq U),求(S)中所有点集的并集大小。

可以令(f(S))表示(S)中所有点集的并集大小,(g(S))表示 (S)中所有点集的交集大小,根据容斥原理,有

[f(S)=sum_{Tsubseteq S} (-1)^{|T|-1}g(T) ]

求出所有(g(S))后高维前缀和即可。

至于如何求(g(S)),可以考虑对每一个点(x),向所有的(S),(其中(S)中所有点集的交包含 (x)),做贡献,可以发现,若所有包含点(x)的点集所组成的集合为(S') ,那么对于所有(Tsubseteq S'),点(x)都会对(T)产生1的贡献,所以直接在数组(g[S']) 处加1,然后高维后缀和即可。

一道例题

原文地址:https://www.cnblogs.com/lishuyu2003/p/11295270.html