legend_noa's blog

LFYZ蒟蒻竟然写题解!!!……

导航

大数据-快读

  在数据量很大并导致代码超时或读入影响总时间复杂度时,会使用快读。

  思路:将所输入数据看做一个一个字符即字符串,在输入(标准输入或fopen)完成之前,从缓冲区读入输入的数据。由于一般的输入(scanf()、cin、getline()等)都是在输入结束后,即缓冲区发现“空”(0、空格、换行符)的时候通过流从缓冲区读取,而getchar()在每个字符进入缓冲区时都会读入,从而可以用getchar()大大提高读入的效率。

  代码:

 1 void read(int &a){ //对a进行读取
 2     int s=0, w=1;
 3     char b=getchar();
 4     while(b<'0' || b>'9'){
 5       if(b==‘-’) w=-1;
 6       if(b==' ') read(b);
 7       if(b==isspace()) read(b);//isspace()为换行符,在WIndows和Lunix下可以通用;
 8     }
 9     while(b<='9' && b>='0'){
10       s=10*s+b-'0';
11       b=getchar();
12     }
13     a=w*s;
14     return ;
15   }
16    int main(){
17     int n;
18     cin>>n;
19     for(int i=1;i<=n;i++){
20       read(a[i]);
21     return 0;
22   }

 

  上述代码虽然从理论上完成了快读,但是由于大量调用函数和递归时的压栈弹栈,还有绝对引用,效率依然不高,可进行一定的优化。

  通过使用内联函数inline可使其在预处理时被替换进代码内,避免了调用函数时大量的弹栈压栈,从而提高了效率。其次,使用内联函数的返回值,可以省去绝对引用所占用的时间和内存。此外,将代码中的递归过程能够转化为递推过程,也可以提高效率。

  优化代码如下:

 

 1 inline int read(){ 
 2    int s=0, w=1;
 3    char b=getchar();
 4    while(b<'0' || b>'9'){
 5      if(b==‘-’) w=-1;
 6      b=getchar();
 7    }
 8    while(b<='9' && b>='0'){
 9         s=10*s+b-'0';
10      b=getchar();
11    }
12    return w*s;
13   }
14  int main(){
15   cin>>n;
16   for(int i=1;i<=n;i++)
17     a[i]=read();
18   return 0;
19  }

 

  

posted on 2018-06-24 14:40  legend_noa  阅读(88)  评论(0编辑  收藏  举报