某天,看到這樣一個場景(要求時限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等)
希望以上技巧對你有幫助