快速讀入詳解

2022-05-23 22:42:10 字數 1286 閱讀 3415

當你在資訊學競賽\((oi)\)中進入了提高組時,你可能會被卡常!

程式被卡常數,一般指程式雖然漸進複雜度可以接受,但是由於實現/演算法本身的時間常數因子較大,使得無法在oi/icpc等演算法競賽規定的時限內執行結束。

常數被稱為計算機演算法競賽之中最神奇的一類數字,主要特點集中於令人捉摸不透,有時候會讓水平很高的選手迷之超時或者超空間。

​ ——來自某度百科……

簡稱快讀,是資訊學競賽中卡常數最為常見的方法。

一般來講,大多數題目的出題人都不會到這種喪心病狂的地步。

不過,以防萬一肯定沒壞處啊~ 反正**很簡單啦

先上**!講解在後面。

inline int read()

while(ch >= '0' && ch <= '9') s = s * 10 + ch - '0', ch = getchar();

return s * w;

} // 這是能判負數的c++快讀模板

在**中,只需將cin >> nscanf("%d", &n)改成n = read()即可!

為什麼\(cin\)慢?因為它需要和\(stdio\)保持同步,也就是sync_with_stdio

為什麼\(scanf\)慢?原因有點複雜。

它可以接受多種形式的輸入(數字、字串等等),因此需要判斷。

它因為某些安全原因——輸入太快可能會有些玄學的\(bug\),具體的我也不太清楚。

其實在\(c++\)中,依次讀入單個字元是比一次讀入乙個數要快的,因此我們可以用\(getchar()\)來負責讀入。

在實際的檔案中,會有許多不必要的隱藏字元,比如換行符\n等。

因此,我們需要先排除掉這些字元,也就是第乙個\(while\)迴圈。但是有乙個特例:\(-21904\)中的\(-\)號。這個負號不是數字啊!於是我們用\(w\)當數的符號。有負號時,\(w\)從原來的\(1\)轉化成了\(-1\)。

於是,我們要特判!if(ch == 『-』) w = -1;這就是判負號的語句。

下乙個迴圈中,就是位值原理。數\(\overline = 10 \times (10 \times (10 \times a + b) + c) + d\),讀者自證不難。

最後返回\(n = sgn(n) \times |n|\),其中\(sgn(x)\)為\(x\)的符號。

極 快速讀入

14.8 kb 的快讀 以後拉板子方便啦!從 這裡 賀過來的 起源是 here 用 mivik 的 壓行機 壓縮 變數名再壓就看不下去了,放 include include include include include include include need to include平凡版本 fro...

快速讀入的技巧

在oj上練習題目時,有些題目資料的輸入非常大,即便是使用scanf 也會被卡常數,最後導致tle。因此蒐集網上的解決方案,常見的有以下兩種 一 當資料量不是特別大的時間,此時可以關閉stdio的同步,使得cin,cout與printf,scanf一樣快。核心 ios sync with stdio ...

抽屜原理 快速讀入

十個蘋果放進九個抽屜,一定存在乙個抽屜中放著至少兩個蘋果的情況。給定乙個長度為n的整數數列,你需要判斷是否能找到乙個長度為 int sqrt n 1 的非降序列或者乙個長度為 int sqrt n 1 的非增序列。形式上表示,輸出答案yes當且僅當你可以找到乙個子串行a 他的長度為 int sqrt...