ACM卡常处理办法(虽然我到现在没遇到)
生活随笔
收集整理的這篇文章主要介紹了
ACM卡常处理办法(虽然我到现在没遇到)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
今天做預流推送,一樣的代碼。別人500MS(OI選手)而我5S,百思不得其解,然后我知道了還有卡常這一說。
我們今天就來看一看吧:
1.循環展開:
?在緩存和寄存器允許的情況下一條語句內大量的展開運算會刺激 CPU 并發。舉個栗子。
void Init_Array(int *dest, int n) {int i;for(i = 0; i < n; i++)dest[i] = 0; }void Init_Array(int *dest, int n) {int i;int limit = n - 3;for(i = 0; i < limit; i+= 4)//每次迭代處理4個元素{dest[i] = 0;dest[i + 1] = 0;dest[i + 2] = 0;dest[i + 3] = 0;}for(; i < n; i++)//將剩余未處理的元素再依次初始化dest[i] = 0; }2.特殊運算優化:(或許這真的沒用)
?取模優化:
int MOD(int x, int y){return x - y * (x / y); }//==x%y? 絕對值優化:
inline int Abs(int a){//絕對值優化 { int b=a>>31; return (a+b)^b; }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卡常处理办法(虽然我到现在没遇到)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: preipo是什么意思
- 下一篇: 阳光财产保险怎么退保 阳光财产保险退保方