卡常的全名叫做卡 常 數,
顧名思義,這是一種簡單有效的優化。
只可惜,它最多只能降低大約十幾毫秒的時間,
但筆者作為乙個相當的蒟蒻,
當然要為廣大 \(\operatorname\) 獻上乙份卡常計畫書啦!
c++
中有乙個叫做register
的東西,
它可以將變數存入暫存器中。
暫存器可以做到快速存入與取出,
因此也能起到優化作用。
舉乙個栗子:
for(int i=1;i<=n;i++)
這是經典的for
迴圈,
但由於i++
有乙個 \(o(1)\) 級別的引用操作,
所以,如果將i++
改成++i
,能起到微小的優化,
不過,有總比沒有好。
我們知道,
計算機與位運算都是基於二進位制下的操作,
那麼,如果我們用一些簡單的位運算代替c++
自帶的運算,
豈不美哉?
在這裡,筆者直接抓一把新鮮的栗子給各位康康 (懶得解釋:
將乙個整數i
乘上2
的正整數次冪(\(i\times 2^n\)),用i<
將乙個整數i除以2
的正整數次冪(\(i\div 2^n\)),用i>>n
;
將乙個整數i
對2
的正整數次冪取餘(\(i\mod 2^\)),用i&((1<
交換兩個整數x和y
,用x^=y^=x^=y
(可以直接巨集定義);
將整數i
正負號轉換,用i=~i+1
或i=(i^-1)+1
;
判斷整數 i 的奇偶性,用 i&1 (基於第三條)
7.i!=-1 優化成 ~i
使用時注意優先順序
玄學卡常技巧總結
近期總是被cin和cout搞tle,一時興起找了些卡常技巧 文末有參考說明 快讀 inline intread while c 0 c 9 return x f 一般不用輸出優化 inline void out int x putchar x 10 0 在宣告函式之前寫上inline修飾符,可以加快...
卡常筆記本
不是刻意搞的,只是把平時的經驗放上來。sqrt 的是我覺得比較有用的 話說沒用的好像被我刪了哈 它們之間差了4倍常數,所以慎用long long 開o 2o 2 o2 後前者略快於後者,不開o 2o 2 o2 慢到飛起,建議noipcsp乖乖手寫 2種寫法,被打了注釋的那種 常數差不多是另一種的2倍...
卡常技巧(部分只在GMOJ上適用)
化學中有乙個神奇的東西,它不溶於水,不溶於鹼,不溶於酸,不溶於有機物。它水火不侵,百毒不傷,無論是在噴燈上加熱,還是接通高壓電,亦或是通入氟氣,它都毫髮無損。人們聞知而色變,它叫 雜質。資訊學中也有乙個神奇的東西,它能使o n 2 o n 2 o n2 的程式輕鬆碾壓105 10 5 105的資料,...