原來的讀優是這樣寫的:
int _read(){
int sum=0;char ch=getchar();
while(!(ch>='0'&&ch<='9'))ch=getchar();
while(ch>='0'&&ch<='9')sum=sum*10+ch-48,ch=getchar();
return sum;
}
可是,遇到資料流大的題目(如4*10^6),如果你的電腦不夠快,還是會逾時。
最近請教了Manchery大神,才發現讀優是這樣寫的:
inline char nc(){
static char buf[100000],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline int _read(){
char ch=nc();int sum=0;
while(!(ch>='0'&&ch<='9'))ch=nc();
while(ch>='0'&&ch<='9')sum=sum*10+ch-48,ch=nc();
return sum;
}
其中的nc函數就相當于原來的getchar();
這個函數的原理就是先把資料流中的一整段都存下來,然後從這個數組裡讀取,直到數組讀空了再重新從資料流中讀取,由于是整段整段讀取,是以自然比getchar()要快的多。
=====以下為轉載者添加=====
不過我們會發現,一旦用了這個讀入優化。getchar,scanf都不能用了(存到buf裡了),所有讀入都必須自己寫了。是以說資料流不是太大的時候(如1*10^6),可以考慮不用這個讀入優化。
se/phoenix/template/css/markdown_views-ea0013b516.css">
</div>