高维前缀和
高维前缀和可以求出关于一个集合子集(或超集)的状态的和
从低到高枚举位数,之后枚举集合中的所有元素
总复杂度为\(O(n2^n)\)
int n,f[1048576];//n为位数
for(RG int i=0;i<n;i++)
for(RG int j=0;j<(1<<n);j++)
if(j&(1<<i))f[j]+=f[j^(1<<i)];
一个问题:
给定一个长度为\(n\),取值为\([0,2^m)\)的数组,取出两个数\(a,b\),求\(a|b\)的最大值
首先高维前缀和一遍求出是二进制超集的集合是否存在
之后对于每一个数,按位贪心求最大值即可