對於輸入數據非常大的一些可(變)愛(態)題目,scanf就會大大拖慢程序的運行速度,cin就更不用說了,所以我們要用一種高大上的東西——讀入優化。
讀入優化的原理其實就是一個一個字符的讀入,再組成數字
==================================================================
下面貼一段讀入優化的模板
1 int read() 2 { 3 int x=0,f=1; 4 char ch; 5 while(ch<'0'||ch>'9') {if(ch=='-')f=-1;ch=getchar();} 6 while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} 7 return f*x; 8 }
這就是最基本的讀入優化,通過getchar函數依次讀入字符,用x記錄答案,用f判斷正負。
ps:在主程序中調用時int n=read();即可
===========================前方高能預警===============================
下面是dalao的讀入優化模板
1 template<class T>void read(T &x) 2 { 3 x=0;int f=0;char ch=getchar(); 4 while(ch<'0'||ch>'9') {f|=(ch=='-');ch=getchar();} 5 while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();} 6 x=f?-x:x; 7 return; 8 }
template就是讓這個函數隨時可以調用,而且可以用int、double、char……(反正很裝13就對了)
用了指針,會快更會裝13。
下面的f|=(ch=='-')如果ch==‘-’,f就改符號(還可以判斷多個負號),位運算,會快
<<x就相當於2^x,會非常快;
最后問號表達式裝13
總之就是一個優(裝)化(B)的讀入優化
ps:不過TA真的比普通的讀入優化要很多
pss:調用時直接read(n)就好了這就是指針的好處
===========================我是分割線================================
以下的讀入優化需要在freopen條件下使用(其實用的不是很多,大多數情況用上面那種)
下面是比以上讀優都要快的julao的讀入優化(划重點)fread
1 inline char GET_CHAR(){ 2 static char buf[maxn],*p1=buf,*p2=buf; 3 return p1==p2&&(p2=(p1=buf)+fread(buf,1,maxn,stdin),p1==p2)?EOF:*p1++; 4 } 5 template<class T>void read(T &x) 6 { 7 x=0;int f=0;char ch=GET_CHAR(); 8 while(ch<'0'||ch>'9') {f|=(ch=='-');ch=GET_CHAR();} 9 while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=GET_CHAR();} 10 x=f?-x:x; 11 return; 12 }
簡單的來說就是把getchar函數手寫,改為文件讀入(fread)。
eg:fread原理:把數據流整段的存到數組buf中,整段的讀取,數組存滿了再重新覆蓋。所以比getchar()一個一個讀要快
其實我也不是很懂fread,感性理解吧QAQ。
===========================我是分割線================================
一點點忠告:說實話用不用讀入優化完全看自己,如果要用就把它當做一個模板,哪怕是a+b的時候也打上。我就是這樣(有點讀入情節)雖然有的時候並不能快多少,但是至少會讓自己的代碼效率稍微高那么一丟丟,而且天天打,永遠不會錯。
但有些dalao平時不用,考試的時候打上,其實我不太建議這樣。因為身邊有好幾個朋友都是因為在考場上讀優打錯,然后0分。非常的可惜,所以如果考試要用的話最好多打幾次保證自己不會錯,防止在復賽上gg
NOIP2018RP++;
感謝學姐uncle-lu的模板
61646D696E