今天做預流推送,一樣的**。別人500ms(oi選手)而我5s,百思不得其解,然後我知道了還有卡常這一說。
我們今天就來看一看吧:
1.迴圈展開:
在快取和暫存器允許的情況下一條語句內大量的展開運算會刺激 cpu 併發。舉個栗子。
void init_array(int *dest, int n)
void init_array(int *dest, int n)
for(; i < n; i++)//將剩餘未處理的元素再依次初始化
dest[i] = 0;
}
2.特殊運算優化:(或許這真的沒用)
取模優化:
int mod(int x, int y)//==x%y
絕對值優化:
inline int abs(int a)
3.前置++/--運算子:
用++i
代替i++
。
1. 後置++需要儲存臨時變數以返回之前的值,在 stl 中非常慢。
2. 事實上,int的後置++ 在實測中也比前置++ 慢0.5倍左右(uoj 上自定義測試)
4.比較語句:
if()
else //慢
()==()?():();// ==可以換成任何二元比較運算子(== >= > < <= )能判斷真值即可。
5. 內聯函式:
int imhanshu()
inline int imhanshu()
重複使用多的可以使用內聯函式,用的少的和遞迴就別用了。5.卡cache
開數多維組的時候小的開在前面,訪問多的一維開在前面定址快。
6.快讀自行查詢:
7.register
for(int i=0;i<100000000;++i)//慢
for(register int i=0;i<100000000;i++) //快
8. #pragma gcc optimize(2)
這便是o2優化
它的作用極大,但如果**不規範,它在優化時會改變某句**的含義,所以在用時一定要小心從30%tle變為100%wa;
ACM卡常處理辦法(雖然我到現在沒遇到)
今天做預流推送,一樣的 別人500ms oi選手 而我5s,百思不得其解,然後我知道了還有卡常這一說。我們今天就來看一看吧 1.迴圈展開 在快取和暫存器允許的情況下一條語句內大量的展開運算會刺激 cpu 併發。舉個栗子。void init array int dest,int n void init...
卡常筆記本
不是刻意搞的,只是把平時的經驗放上來。sqrt 的是我覺得比較有用的 話說沒用的好像被我刪了哈 它們之間差了4倍常數,所以慎用long long 開o 2o 2 o2 後前者略快於後者,不開o 2o 2 o2 慢到飛起,建議noipcsp乖乖手寫 2種寫法,被打了注釋的那種 常數差不多是另一種的2倍...
玄學卡常技巧總結
近期總是被cin和cout搞tle,一時興起找了些卡常技巧 文末有參考說明 快讀 inline intread while c 0 c 9 return x f 一般不用輸出優化 inline void out int x putchar x 10 0 在宣告函式之前寫上inline修飾符,可以加快...