卡常技巧


某天,看到這樣一個場景(要求時限3000ms)

是不是突然很想罵人?

不過,以下一些知識可能幫到你

教你如何卡常(c++)(我太弱了,大佬勿噴

1.相信你們都知道 for(int i=1;i<=n;i++),改為++i更快

然后發現照樣沒快多少(哎~~)

怎么辦呢?

 

2.相信你們還是知道 把諸如int a=1 改為 int a(1) 更快

發現自己少了一百多毫秒,但依然T了

這時候

 

3.相信你們依然知道 在函數前加inline可以加快(可能不會吧)

 

4.在int前加register(這個也很基本吧)

於是乎愉快地A了

再想想還有什么你知道的卡常?

 

5.重要的一點--讀入優化(應該都知道)

 

void read(int &x)
{
    int f=1;
    x=0;
    char s=getchar();
    while(s<'0'||s>'9')
    {
        if(s=='-')
            f=-1;
        s=getchar();
    }
    while(s>='0'&&s<='9')
    {
        x=x*10+s-'0';
        s=getchar();
    }
    x*=f;
}


 

又快了一些。

6.能不用變量就不用,轉而用常量(大部分人也知道吧)

 

7.取模用減法代替

ll mo(ll x,ll y)
{
	return x+y>=mod?x+y-mod:x+y;
}

 

8.盡量用位運算

比方說:

a%2改為a&1

a*2改為a<<1

a*2+1改為a<<1|1

 

 

9.數組盡量不要是偶數個數的(原因不明)

偶數個數后滿了3ms(有時候會慢很多) 

10.把循環給盡量展開,速度會快很多

  如:把for(int i=1;i<=n;++i) a=1,b=1;

    改為for(int i=1;i<=n;++i)a=1;

      for(int i=1;i<=n;++i)b=1;

 

11.盡量消除條件的跳轉

 

12.訪問a[i]后訪問a[i+1],a[i+2]等會快很多

 

13.盡量不要用algorithm中的自帶函數(除sort等)

希望以上技巧對你有幫助

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM