成對變換
對於非負整數\(n\):
當\(n\)為偶數時,\(n xor 1\)等於\(n+1\)
當\(n\)為奇數時,\(n xor 1\)等於\(n - 1\)
「0 和 1」, 「2 和 3」, 「4 和5」......關於\(xor 1\)運算構成「成對變換」
這一性質常用於圖論鄰接表中邊集的儲存。在具有無向邊(雙向邊)的圖中把一對正反方向的邊分別儲存在鄰接表陣列的第\(n\)和\(n+1\)位置(\(n\)是偶數)
通過\(xor 1\)運算可以得到當前邊和反向邊的儲存位置。
\(lowbit\)
\(lowbit(n)\)定義為非負整數\(n\)在二進位制表示下「最低位的1及其後邊所有的0」構成的數值。
\(lowbit(n) = n & (~n + 1) = n & (-n)\)
因為假設\(n\)的第\(k\)位是\(1\), 第\(0~k-1\)位都是\(0\)
\(~n\)的第\(k\)為是\(0\), 第\(0~k-1\)都是\(1\)
那麼\(~n + 1\)的第\(k\)是\(1\), 第\(0~k-1\)都是\(0\)
其實根據補碼的一種求法也可以知道,\(~n +1\)的高位到第\(k+1\)位都和\(n\)相反,\(0~k\)位不變。
進行\(&\)運算後得到的就是\(lowbit(n)\)
\(lowbit\)加hash可以找出整數二進位制表示下所有是1的位,複雜度與1的個數同級。只需要每次做\(n = n - lowbit(n)\)的操作
用乙個hash陣列來儲存2的冪次,\(h[2^ mod 37] = k\), \(\forall k \in [0,35], 2^ mod 37互不相等,且恰好取遍1~36\)
二分
右移運算\( >> \)是向下取整,而整數除法是向零取整,對於二分值域包含負數時後者不能正常工作。
實數域上的二分
確定好精度\(eps\)以\(l+eps保留\(k\)位小數的題目中,取\(eps = 10 ^ \)
或者採用迴圈固定次數的二分方法。
演算法競賽高階指南筆記
原碼 原碼就是符號位加上真值的絕對值,即用第一位表示符號,其餘位表示值.比如如果是8位二進位制 其中,第一位為1是負數 1 0000 0001 原 1 1000 0001 原 因此,8位二進位制數的取值範圍 127,127 補碼正數的補碼是其本身 負數的補碼是在其原碼的基礎上,符號位不變,其餘各位取...
演算法競賽高階指南學習筆記(2)
對頂棧 建立兩個棧 來動態維護序列中間的操作 類似對頂堆的思想 單調棧 棧內元素始終單調 排除不可能的選項 時間複雜度為o n 例題queue deque 單調佇列 單調佇列總不會寫 記得常練 cin n k for int i 1 i n i int head 1,tail 0 for int i...
Google C 風格指南 閱讀筆記
這個google c 風格指南出得太好了,有很多c 的問題,其實通過閱讀這份文件就可以了。相信讀完後,可以在簡歷上加上一句,具有良好的編碼風格 哈哈。下面記錄一下我的讀書筆記吧。整份文件的中文版本我已經上傳到了資源裡面。每次eclipse cdt新建乙個class的時候,都是做了define保護 所...