作为一个使用C++的童鞋。。。龟速的IO往往令人蛋疼。。所以要手动加速。。
(1):cin : scanf = 10 : 1
cin的龟速是闻名的。。。只要输入超过1W个数我就不敢用了。。
(2):
看看下面这个函数:
inline int nextInt()
{
char c;c=getchar();
while(c!=’-‘&&(c<‘0’||c>’9’))c=getchar();
int n=0,s=1;if(c==’-‘)s=-1,c=getchar();
while(c>=’0’&&c<=’9′)n*=10,n+=c-‘0’,c=getchar();
return n*s;
}很显然这是一个很SB的读入数字的函数。。。
但是这个的速度是scanf的4倍瀑布汗。。
(3):Pascal的读入之所以快速是因为里面有读入到缓冲区。。
C++只好手动了。。
#define BUFSIZE 1000000
char buf[BUFSIZE], *pt = buf + BUFSIZE, *pend = buf + BUFSIZE;
int sign;
#define read()
do{
if (pt >= pend)
{
pt = buf;
fread(buf, 1, BUFSIZE, stdin);
}
} while(0)
#define scan(t)
{
t = 0;sign=1;
read();
while ((*pt<‘0’||*pt>’9′)&&*pt!=’-‘) {pt ++; read();}
if(*pt==’-‘)sign=-1,pt++;
while (((*pt) >= ‘0’ && (*pt) <= ‘9’)) {t = t * 10 + (*(pt ++)) – ‘0’; read();}
t*=sign;
}
#define scan_str(s)
{
int p = 0;
read();
while ((*pt) == ‘ ‘ || (*pt) == ‘n’ || (*pt) == ‘r’) {pt ++; read();}
while (!((*pt) == ‘ ‘ || (*pt) == ‘n’ || (*pt) == ‘n’)) {s[p ++] = (*(pt ++)); read();}
s[p] = 0;
}fread就是直接读一大块数据。。速度自然很快。。然后手动模拟缓冲区。。
速度又提高一倍。。跟Pascal差不多了。。
(5):输出也有悲剧的地方。。
int A[20],k;
inline void print_int(int x)
{
if(x<0)putchar(‘-‘),x=-x;
k=0;while(x)A[k++]=x%10,x/=10;
for(int i=k-1;i>=0;i–)putchar(‘0’+A[i]);
putchar(‘n’);
}这么一个函数往往比纯printf快N多。。。
(6):或者干脆输出也用一个缓冲区。。
用一个大数组s存储要输出的字符。。然后一口气输出。。。
太NB了!!!
“回复chonglinsun:?哪有什么一堆”囧。。。” 我留言留错地方了,是这…………
回复chonglinsun:额。。这是用来延长宏定义的。。本来宏定义只有一行。。
回复WJBZBMR:哦, 明白了。
貌似这个输出这么写在x==0的时候要悲剧。。。
回复ariosxcw:。。是的。。。