個人總結 常用 OI 技巧彙總

2022-05-05 19:42:09 字數 2281 閱讀 3905

嚴格來說,這可能並不能算作學習筆記,但還是這麼算了。

這篇文章可能全程比較沙雕,所以對於風格不要過度在意。

咳咳,上面都是作者的廢話。下面進入正題。

這篇文章主要介紹的是一些比較常用(?)的 oi 小技巧。這可能有助於在 oi 中獲得優勢(?\(\times 2\))。

文章內容按照字典序排序。(啥時候想到就寫一下吧)

這是乙個極其常用的小技巧,原因比較簡單,那就是比賽時常用。

通常來說,一道題的答案如果過大的話,有兩種方案——高精度和取模。

但是,由於前一段時間(?\(\times 3\))的接連不斷的高精度把人弄得有一點煩,加上高精度本身也有複雜度一說,所以並不是乙個理想的評測演算法的工具。

取而代之,很多題目都會在題目末尾加上一句「答案對 \(998244353\) 取模」或類似的話。一來是解決內建變數儲存上限,二來則是忽略計算複雜度。

但是,當模數極其接近變數上限邊緣時,乘法就變得岌岌可危,比如:計算 \(123456789876\times 5432123456789 \bmod\) 這種類似的東西。

咳咳,於是乎,我們就發明了一種很棒的東西。這可以解決模數上限的問題,但不可避免地會出現一點常數,雖然只有 \(o(\log n)\)。這就是龜速乘。

那說了這麼多,龜速乘到底是個什麼東西呢?????說白了就是快速冪。為什麼?

多次連乘是乘方運算,多次連加就是乘法運算

也就是說吧乘法變成一次次的加法而達到其目的,也就不可避免地有 \(o(\log n)\) 的多餘複雜度。

但是!這並不是唯一的解決辦法,網上還有通過 long double 來卡精度從而達到 \(o(1)\) 的龜速乘,這裡不再贅述。

快速冪是位運算的應用中的一種,可以在 \(o(\log n)\) 的時間內計算形如 \(a^b\ (b\in \mathbb^)\) 的演算法。

簡單來說,就是計算乙個數列 \(\left\),使得 \(b=\sum\limits_^k \left(c_i\times 2^i\right)\),這可以通過二進位制分解在 \(o(\log n)\) 的時間內解決。

接下來是演算法的精髓——注意到 \(2^i=2^ + 2^\),即 \(u^=\left(u^}\right)^2\)。

\(\therefore\quad a^b=\prod\limits_^k a^\)

而預處理 \(a^\) 是 \(o(k)\sim o(\log n)\),總體就是 \(o(\log n)\)

updated on 2020-08-27

顧名思義,快讀是一種加快讀入速度的技巧。經實踐比cin快一倍。如果使用fread(俗稱「光速讀」),在 \(10^7\) 級別的整數讀入時可以節省將近 \(60\ \textrm\) 的時間。

快讀的核心操作就是減少判斷來達到比scanf更快的效果。一般來說,快讀的步驟是這樣的:

讀入字元,直到發現數字或是負號;

如果讀入了負號,就打上標記;

讀入這個數,有標記的把標記打上。

所以,實現大概就是那個樣子:

inline int read()

while (ch >= '0' && ch <= '9')

return n * t;

}

當然,作為一項卡常神器,快讀的奇特優化必然是少不了,接下來介紹幾個比較常用的優化:

用 ctype.h 內的isspaceisdigit函式來取代判斷部分,這樣可以很大程度上減少判斷。

當然,如果題目中的數給定的是自然數就可以省去負數的判斷。

用異或和位移來加速加減法的優化。在某種意義上有一點作用,但是相比於下面這個就微不足道了 hh——

就是提前大塊讀入,然後做快讀時直接呼叫陣列。經測試是一種極其優秀的優化。

但由於其編寫麻煩,一般只用於範圍是 \(10^7\) 級別的 io。

這裡是一道用來卡常快讀的題目,用你的快讀把這道題 a 了吧!

當然,我們也可以實現類似功能的快寫。但是由於類似的功能不常用,所以一般不用大優化。

放一下模板(一般都是遞迴寫的,想要手寫棧也沒事):

void _write(int x)

inline void write(int x)

沒錯,你沒聽錯,拓撲序可以用 dfs 來求。這個神秘的技巧可以在 tarjan 縮點後 dag dp 中幫助省掉一大堆**。

結論是:dfs 的出棧序是反圖的拓撲序。自行手玩感性理解。

Vim常用技巧彙總

底線命令模式 last line 切換,回車執行 在命令模式 u撤銷上乙個動作 undo 在撤銷之後用ctrl r復原 redo 小數點符號可以重複上一次的動作 縮排4個空格,反向縮排 ctrl v進入塊選擇模式,選中你要注釋的行,再按大寫的i進入行首插入模式輸入注釋符號如 或 輸入完畢之後,按兩下...

Excel常用技巧彙總

點選名字,檢視使用教程 excel常用公式函式之mid文字提取 excel常用公式函式之mid文字提取 excel常用公式函式之字串拼接 字串連線 excel常用公式函式之字串拼接 字串連線 excel常用公式函式之資料篩選 資料統計 excel常用公式函式之資料篩選 資料統計 excel常用公式函...

C 常用小技巧個人總結(持續更新)

求任意陣列長度 sizeof array sizeof array 0 c 多關鍵字排序 struct node int a int b int c 三重引數 friend bool operator const node x,const node y 過載 重新定義 小於號 if x.aif x....