1. 程式人生 > >[學習筆記]位運算

[學習筆記]位運算

計算機為什麼用二進位制?

因為二進位制簡單。每個位置只有0/1兩種情況。

並且任何數都可以表示成二進位制。

0/1代表開/關,選/不選都有優勢。

 

例題:

1.

Single Number

■ 有一個數組,裡面的元素每個都出現了兩次,除了一個特殊的,求這個特殊元素。

直接異或

Single Number II

■ 還是一個數組,每個元素出現兩次,只有兩個特殊的元素出現一次,把這兩個特
殊的元素找出來。

兩個元素不同,至少一位不同。

所有的數異或起來得到a^b,任取為1的一位作為分解線,ab有一個這一位是1,另一個是0.然後把這一位是1的放一組,是0的放一組。

這樣a,b一定分開了。然後分別異或可得。

2.BZOJ 4300 絕世好題

■ 給定一個長度為n的數列ai,求ai的子序列bi的最長長度,
■ 滿足bi&bi-1!=0(2<=i<=len)。

■ n<=100000,ai<=2*10^9

 

類似最長上升子序列統計。由於和前一位至少一位都有1,列舉是1的那一位,然後字首max即可。

 

BZOJ 3687: 簡單題

■ 小呆開始研究集合論了,他提出了關於一個數集四個問題:
1.子集的異或和的算術和。
2.子集的異或和的異或和。
3.子集的算術和的算術和。
4.子集的算術和的異或和。
目前為止,小呆已經解決了前三個問題,還剩下最後一個問題還沒有解決,他決
定把這個問題交給你,未來的集訓隊隊員來實現。
■ ai >0,1 < n < 1000,∑ai≤2000000。

 

之間算不好算。發現,異或滿足交換律,所以,如果一個算數和出現了2次,那麼貢獻就是0了。

所以,bitset<2000000>f,計算算數和為f[i]的次數的奇偶性。

對於x,f^=(f<<x)即可。初始f[0]=1;

其實就是bitset優化揹包。。。。