bitset學習筆記

挥泪斩马谡 2024-07-29 18:22 15次浏览 0 条评论 taohigo.com

本來是想學傳遞閉包才學習bitset的,但用處實在太多瞭

bitset的表達

bitset<N>a 代表長度為N的bool數組,他通過壓位來減小時間和空間復雜度,比一般的bool數組優秀不少,初始值均為0

作用:可進行bool數組的類似操作,同時復雜度會更加優秀

可進行相關函數和操作:

1.可以利用a[i]來訪問第i位的內容,內容隻有0/1兩種

bitset<N>a,b

2.a&b a|b a^b ~a << >>(多出來的位補0) 復雜度均為O( frac{n^{2}}{w} )w一般為64

3.相關函數

a.set(x)第x位賦值為1

a.set()全部賦值為1

a.reset()全部賦值為0

a.reset(x)第x位賦值為0

a.filp(x)翻轉第x位

a.filp()將所有翻轉

//以上復雜度為O(1)

a.any()隻要有1就是true

a.none()//是否全部為0

a.count()//統計1的個數

//以上復雜度為O(n/w)

相關題目訓練:

可當一些比較常見類型的題目來記錄:

BZOJ 3687,簡單題

BZOJ 3687

對於所有子集問題我們可以考慮dp方向

dp[i][j]代表前i個數組合表達出j的方案數,註意到異或隻和出現的奇偶性有關,所以我們dp可以表達位dp[i][j]前i個數組合表達出j的方案數奇偶性

考慮轉移:

dp[0][0]=1;
for(int i=1;i<=n;i++)
{
for(int j=0;j<=maxn-10;j++){
dp[i][j]^=dp[i-1][j];
if(j>=a[i])
dp[i][j]^=dp[i-1][j-a[i]];
}
}