ACM卡常處理辦法(雖然我到現在沒遇到)

2021-09-29 06:25:06 字數 1387 閱讀 3762

今天做預流推送,一樣的**。別人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修飾符,可以加快...