並不對勁的卡常技巧

2022-05-08 20:33:07 字數 499 閱讀 6339

俗話說的好,心中有黨,常數極小。

1、迴圈中加暫存器優化for(register int i;i<=n;i++){}

好像在開o2時這個沒什麼用。

2、函式前inline int f(int x){}

當呼叫函式本身的時間長度比執行函式的更長時效果會更顯著。配合read()、write()使用更佳。

3、將取模運算改成if(x>=mod)x-=mod

取模運算常數極大。但要注意這只適用於當x增加的量不大於mod時。

4、將i++改為++i

5、迴圈展開for(int i=1;i<=n;i+=2){}

據說是記憶體訪問更優了,總之很玄學。

6、讀入/輸出單個字元用putchar(),getchar()

7、少用指標

7.5、說到指標,可以用while(1)報效(復)社會

8、少用bool

9、將x*2改為x<<1,將x/2改為x>>1

位運算會快一些,但要注意加括號。

並不對勁的splay

splay和不加任何旋轉一定會被卡的二叉搜尋樹的唯一區別就是每次操作把當前節點旋轉到根。旋轉有各種zig zag的組合方式,感覺很麻煩,並不對勁的人並不想講。其實可以找出一些共性將它們合併。設ls a 點a是其父親的左兒子 son a 0 a的左兒子,son a 1 a的右兒子,fa a a的父親。...

並不對勁的費用流

最小費用最大流肯定要保證最大流,所以它和最大流有一些類似的性質。如果把費用看成邊,就可以每次走最短路 保證費用最小 走到不能走為止 保證最大流 費用流版的ek就是這樣。需要注意的是,反向弧的邊權為它對應的正向弧的費用的相反數,所以最短路要用spfa來求。費用流版的dinic,又叫zkw費用流,還是多...

並不對勁的字尾陣列

字尾陣列sa x 表示排序後第x位在排序前的位置。這個東西的求法有兩種,一種是倍增,時間複雜度o n log n 或o n log2n 另一種是用不知道什麼方法做到的o n 至於第二種方法是什麼,並不對勁的人並不知道,所以只說倍增。考慮正常地比較兩個字串,都是從頭比較到尾 那麼,如果把兩個字串都斷成...