FWT泛做
最近複習重新學習了一下FWT,然後做了一些亂七八糟的題目。。
注:下文中的
表示異或符號,
代表按位與,
代表按位或,帶*標記的為好題集
順便提一下 做子集卷積的方法,即求 。為了保證交起來為空集,列舉 的元素個數 ,FWT之後只取元素個數為 的值。
HDU5909 Tree Cutting
對於一個選擇方案,我們僅在深度最小的那個節點上計算。設
表示i號節點上,異或和為x的方案數。不難得到轉移方程:
用fwt優化之。
時間複雜度
BZOJ4589 Hard Nim
不難想到用
表示局面異或和為x的方案數,每堆石子都是等價的,所以就是n次方,快速冪即可
時間複雜度
Codeforces 662C*
一道還挺有意思的題。注意到n很小,所以考慮把每一列上的數狀壓成一個整數。如果我們枚舉了一個行的異或方案,那麼每一列上就有唯一確定的權值,即要麼全選0,要麼全選1。考慮一個行的異或方案,就相當於是把每一列xor上一個數。那麼我們可以構造 表示有多少條列的狀態為 , 表示狀態i的最小代價。
由於異或滿足交換律,那麼有
用fwt優化之,時間複雜度
HAOI2015 按位或
首先要說明的一點是我們一般用
來表示S的補集。
可以考慮min-max容斥,然後我們要求的就是
但是這個不好限制轉化一下,考慮到
,那麼就有
。後面的做一遍高維字首和即可
時間複雜度
SPOJ kosare
鑑於spoj老掛,所以洛谷
用
表示選取的盒子並起來是S的子集的方案數,那麼就可以子集反演得到恰好為S的子集的方案數。
設
為盒子為S的子集的方案數,
,
用高維字首和搞一搞即可。
由於最後只詢問一個值,可以不必做子集反演,可以
地掃一遍。
時間複雜度
SPOJ TLE
用
表示考慮了前i個且以x結尾的方案數。不難得到轉移方程
每次轉移完暴力清空掉
倍數的方案即可。
時間複雜度
hihocoder1496 尋找最大值*
一道還挺有意思的題目,可以考慮列舉
的值
,那麼我們就需要知道最優的
,那麼當然是選最大的。
因為我們難以保證
,不妨放縮條件,維護
的超集中的最大和次大值。這樣顯然不會漏掉最大值,而也不可能有一個不合法的解超過最優值,因為這個不合法的解的
肯定偏小,那麼必定存在一個相應的合法的解比它更大。
列舉超集用高維字首和解決。
時間複雜度