Fast-IO

常用的輸入(出)優化

cin / cout

因為C++ template的性質,不同變數型別的輸出方式都大同小異,算是實用
競程的時候記得開下面兩個東西

1
ios_base::sync_with_stdio(0), cin.tie(0);

開了之後就不要使用 stdio 裡面的東西啦
另外若非互動題也不要使用 endl 之類會flush的函式,請用 '\n' 代替

scanf / printf

常用的也就那些

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#include <cstdio>
int main() {
	int x,y;
	long long L;
	scanf("%d%d%lld", &x, &y, &L);
	printf("%lld\n", x+y+L);
	char s[100];
	scanf("%s", s);
	for(int i = 0; s[i]; i++) s[i] = (s[i]-'a'+1)%26+'a';
	printf("%s\n", s);
}

值得注意的是 iostream 的空間有點大,所以想要壓空間用 stdio 就對了
另外 printf 格式化輸出也常常會在毒瘤題派上用場XD,例如TIOJ 1845

getchar

scanfcin 都判了很多case(的感覺)
對於競賽中固定的輸入格式,自己用 getchar() 一個一個字元讀比較快

1
2
3
4
5
6
7
8
9
#include <cstdio>
inline int nextint() {
	int x = 0, c = getchar(), neg = false;
	while(('0' > c || c > '9') && c!='-' && c!=EOF) c = getchar();
	if(c == '-') neg = true, c = getchar();
	while('0' <= c && c <= '9') x = x*10 + (c^'0'), c = getchar();
	if(neg) x = -x;
	return x; // returns 0 if EOF
}

要印出數字用 printf 就好,如果必須輸出很多可以先存到陣列最後再一起印出,輸出似乎不常成為瓶頸。

fread

快! 還要更快! 如果輸入非常多的時候,我們可以把getchar改成

1
2
3
4
5
6
inline char readchar() {
	const int S = 1<<20; // buffer size
	static char buf[S], *p = buf, *q = buf;
	if(p == q && (q = (p=buf)+fread(buf,1,S,stdin)) == buf) return EOF;
	return *p++;
}

原理可能是自己實現緩衝區,對檔案的讀寫一次做多一點會比較快吧
這個超有感, 1e7 左右的輸入只要不到50ms,有夠扯,例如TIOJ 1093

unlocked

有些可以在後綴加上unlocked加速的樣子,可是我常常感覺不到有快多少(?)

getchar() -> getchar_unlocked()
putchar() -> putchar_unlocked()
fread() -> fread_unlocked()
comments powered by Disqus