最近时常和同学一起刷笔试题, 顺带着开始学点儿OJ上常用的算法. 以往写OJ少, 都是些笔试题, 没卡过输入输出, 一直在用cin/cout. 最近学树状数组的时候tle了, 自己没想到cin/cout被卡了, 看完讨论a掉了.
这样想来, 做题就没必要cin/cout了, 可以直接上scanf/printf, 也不是很麻烦, 而且我觉得格式化字符串比流清晰.
然而有的题还会卡读数字, 如果输入不是很乱可以用快读. 思路就是手动读字母拼数字. 下面这段代码没有负数的时候可以把f去掉.
1 2 3 4 5 6 7 inline  void  Read (int  &x)      x = 0 ; char  c = getchar (); int  f = 1 ;     while  (c < '0'  || c > '9' ) { if  (c == '-' ) f = -1 ; c = getchar (); }     while  (c >= '0'  && c <= '9' ) { x = x * 10  + c - '0' ; c = getchar (); }     x *= f; } 
有的文章用位操作替换了 x * 10 + c - '0' 这个部分, 换成 (x << 1) + (x << 3) + (c ^ 48) , 我觉得意义不大. 如果需要更快, 可以看下文操快读, 手写一个buffer减少取stdin的次数.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 const  int  MAX_SIZE = 1  << 15 ;char  *l, *r, buf[MAX_SIZE];inline  char  Getchar ()      if  (l == r) {         l = buf;         r = l + fread (buf, 1 , MAX_SIZE, stdin);         if  (l == r)             return  -1 ;     }     return  *l++; } inline  void  Read (int  & x)      x = 0 ; char  c = Getchar (); int  f = 1 ;     while  (c < '0'  || c > '9' ) { if  (c == '-' ) f = -1 ; c = Getchar (); }     while  (c >= '0'  && c <= '9' ) { x = (x << 1 ) + (x << 3 ) + (c ^ 48 ); c = Getchar (); }     x *= f; } 
输出也可以加速, 通过手动把数字拼成字符串, 或者结合fwrite的方式输出, 之后如果用到了再看.