FWT泛做

版权声明:写得不好,转载请通知一声,还请注明出处,感激不尽 https://blog.csdn.net/As_A_Kid/article/details/85006382

最近复习重新学习了一下FWT,然后做了一些乱七八糟的题目。。
注:下文中的 \oplus 表示异或符号, \cap 代表按位与, \cup 代表按位或,带*标记的为好题集

顺便提一下 O ( n 2 2 n ) O(n^2 2^n) 做子集卷积的方法,即求 H [ S ] = i j = S , i j = 0 F [ i ] G [ j ] H[S]=\sum_{i\cup j=S,i\cap j=0}F[i]G[j] 。为了保证交起来为空集,枚举 F , G F,G 的元素个数 a , b a,b ,FWT之后只取元素个数为 a + b a+b 的值。

HDU5909 Tree Cutting

HDU

对于一个选择方案,我们仅在深度最小的那个节点上计算。设 f [ i ] [ x ] f[i][x] 表示i号节点上,异或和为x的方案数。不难得到转移方程:
f [ u ] [ i ] = j k f [ u ] [ j ] f [ v ] [ k ] f[u][i]=\sum_{j\oplus k}f[u][j]*f[v][k]
用fwt优化之。
时间复杂度 O ( n v log v ) O(nv\log v)

BZOJ4589 Hard Nim

BZOJ

不难想到用 f [ x ] f[x] 表示局面异或和为x的方案数,每堆石子都是等价的,所以就是n次方,快速幂即可
时间复杂度 O ( m log m log n ) O(m\log m\log n)

Codeforces 662C*

Codeforces

一道还挺有意思的题。注意到n很小,所以考虑把每一列上的数状压成一个整数。如果我们枚举了一个行的异或方案,那么每一列上就有唯一确定的权值,即要么全选0,要么全选1。考虑一个行的异或方案,就相当于是把每一列xor上一个数。那么我们可以构造 a i a_i 表示有多少条列的状态为 i i , b i b_i 表示状态i的最小代价。

a n s ( s ) = i s = j a i b j ans(s)=\sum_{i\oplus s=j} a_ib_j
由于异或满足交换律,那么有
a n s ( s ) = i j = s a i b j ans(s)=\sum_{i\oplus j=s} a_ib_j
用fwt优化之,时间复杂度 O ( n 2 n ) O(n2^n)

HAOI2015 按位或

BZOJ

首先要说明的一点是我们一般用 S \overline S 来表示S的补集。
可以考虑min-max容斥,然后我们要求的就是 A [ S ] = S T P [ T ] A[S]=\sum_{S\cap T} P[T]
但是这个不好限制转化一下,考虑到 P [ S ] = 1 \sum P[S]=1 ,那么就有 A [ S ] = 1 T S P [ T ] A[S]=1-\sum_{T\subseteq \overline S} P[T] 。后面的做一遍高维前缀和即可
时间复杂度 O ( n 2 n ) O(n2^n)

SPOJ kosare

鉴于spoj老挂,所以洛谷

F [ S ] F[S] 表示选取的盒子并起来是S的子集的方案数,那么就可以子集反演得到恰好为S的子集的方案数。
f [ S ] f[S] 为盒子为S的子集的方案数, F [ s ] = 2 f [ S ] 1 F[s]=2^{f[S]}-1 f f 用高维前缀和搞一搞即可。
由于最后只询问一个值,可以不必做子集反演,可以 O ( n ) O(n) 地扫一遍。
时间复杂度 O ( m 2 m + n ) O(m2^m+n)

SPOJ TLE

洛谷

f [ x ] f[x] 表示考虑了前i个且以x结尾的方案数。不难得到转移方程
f [ i ] = i j = 0 f [ j ] = j i f [ j ] f[i]=\sum_{i\cap j=0} f[j]=\sum_{j\subseteq \overline i} f[j]
每次转移完暴力清空掉 c [ i ] c[i] 倍数的方案即可。
时间复杂度 O ( n m 2 m + n m ) O(nm2^m+nm)

hihocoder1496 寻找最大值*

hihocoder

一道还挺有意思的题目,可以考虑枚举 i j i\cap j 的值 k k ,那么我们就需要知道最优的 i , j i,j ,那么当然是选最大的。
因为我们难以保证 i j = k i\cap j=k ,不妨放缩条件,维护 k k 的超集中的最大和次大值。这样显然不会漏掉最大值,而也不可能有一个不合法的解超过最优值,因为这个不合法的解的 k k 肯定偏小,那么必定存在一个相应的合法的解比它更大。
枚举超集用高维前缀和解决。
时间复杂度 O ( v log v ) O(v\log v)

猜你喜欢

转载自blog.csdn.net/As_A_Kid/article/details/85006382
FWT