今天學習了一些基本演算法,理解了快速冪,快速乘,lowbit運算和狀態壓縮的基礎實現。狀態壓縮還不會用。
快速冪:
求a^b 從b的二進位制最低位開始,如果當前位為1 就將a乘到結果裡面去,每左移一位a就乘方一次。
**實現:
int power(int a,int b,int p)
return ans;
}
快速乘:
求a*b 從b的二進位制最低位開始,如果過當前位位1就將a+到結果裡面,每左移一位a就乘2.
**實現:
long long mul(long long a,long long b,long long p)
return ans;
}
lowbit運算
lowbit(n)定義為非負整數n在二進位制表示下「最低位的1及其後邊所有的0」構成的數值。
lowbit(n)=n&(~n+1)=n&(-n)
lowbit運算配合hash可以找出整數二進位制表示下所有是1的位
思想:每用一次lowbit運算求出1後記錄位置,然後再n=n-lowbit(n),使剛求出的為1的二進位制位變成0,迴圈操作,求出所有的二進位制位為1的位置。
當n較小時,另h[2^k]=k
const max_n=1<<20;
int h[max_n+1];
for(int i=0;i<=20;i++)h[1<>n){
while(n>0){
cout<二進位制狀態壓縮的基本操作
取出整數n在二進位制表示下的第k位 (n>>k)&1
取出整數n在二進位制表示下的第0~k-1位 n&((1<
宣告:bitset<10000>s;
表示乙個10000位二進位制數,<>中填寫位數。
~s 返回對bitset s 按位取反的結果。
&,|,^ : 返回對兩個位數相同的bitset執行按位與、或、異或運算的結果。
>>,<<:返回把乙個bitset右移、左移若干位的結果
==,!=:比較兩個bitset代表的二進位制數是否相等
操作符s[k]表示s的第k位,既可以取值也可以賦值
在10000位二進位制數中,最低位為s[0],最高位為s[9999]
count
s.count()返回有多少位為1
any/none
若s所有位都為0,則s.any()返回false,s.none()返回true
若s至少一位為1,則s.any()返回true,s.none()返回false
set/reset/flip
s.set() 把s所有位變為1
s.set(k,v)把s的第k位改為v,即s[k]=v
s.reset() 把s所有位變為0
s.reset(k) 把s的第k位改為0
s.flip()把s的所有位取反
s.flip(k)把s的第k位取反
狀態壓縮的基本操作都理解了,但是還是不會用於解題,下一步看一下八皇后的狀壓解法以進一步理解狀態壓縮。
2019 7 22集訓總結
今天上午看了位運算的部分知識,複習了以前看過的遞迴,學習了快速冪,對書上的例題深入挖掘了一下,下午把 熟悉了好幾遍,看懂了位運算在快速冪中的應用。晚上打了比賽,讓我意識到自己和別人的差距,還有很長的路要走。堅持下去的才是勝利者,心態的問題,計畫的問題,都是我要不斷改進的問題。不管怎麼樣,放手去幹,下...
2019 7 22 匈牙利演算法,KM演算法
這幾天知識點量太大,一時間不易吸收。先占個坑,慢慢填 分享一位博主dark scope的思路,簡單易懂還有趣,雖然是初學,也馬馬虎虎懂了個大概 define maxn 100000 int n,m n個男生 m個女生 二分圖 男生在左女生在右 bool line maxn maxn 兩者之間相互喜歡...
暑假訓練總結 SSL暑假訓練總結
第一周過的還算好吧,覺得飯堂伙食也挺好的,同學也挺好。學習的東西感覺比小學難好多,有種覺得以前學的東西太簡單了的感覺,但多虧了小學的時候基礎打得還算紮實,學得還行,但總是感覺自己就是個菜雞,就是乙個蒟蒻,哎,室友真的太強了。第一周總結 第二週自我感覺挺不錯的,總算追上了部分室友,成績也開始 這一切都...