juminiy
O2快读

C++快读优化常数

快读/快写 的某版本:

// 快读
typedef unsigned long long ull;

inline ull q_read(){
ull x=0,f=1;
char c=getchar();
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();
return x*f;
}

// 快写
inline void write(int x){
    char F[200];
    int tmp=x>0?x:-x ;
    if(x<0)putchar(\'-\') ;
    int cnt=0 ;
       while(tmp>0)
       {
           F[cnt++]=tmp%10+\'0\';
           tmp/=10;
       }
       while(cnt>0)putchar(F[--cnt]) ;
}

 

作用:

  • 这个函数是什么作用呢?

相当于C语言的scanf("%d",&n);C++的cin>>n;

  • C/C++到底快不快?

众所周知,一个语言的速度,不能看他的函数或者方法到底写了什么,要看他最终变成机器码的指令条数;C/C++被称为最快的语言(Go也其实很快),因为他是适合人阅读的代码,也接近于机器码,所以才快!

  • 大规模数据

对于一些大规模量数据的问题(10e5~~10e9)就不能用C++的cin>>了,因为C++的cin>>是给输入流做了重载,而且C++的STL虽然解决了很多问题,底层架构很强,但是也很慢,业内人戏称为大常数STL,不信你可以在使用queue<int>,map<int,string>试一试,中间的DEBUG过程经过了无数次的跳转,会经过几个头文件,这个常数和算法无关!

关于PTA等OJ:

不同的OJ的判题有很多不同,比如:某谷就有O2优化,P某J是普通的算法刷题,某code就让你写函数(方法),....专门考算法的OJ对于这种O2快读,优化不怎么在意,因为算法不取决于语言,是靠你思想的;而浙大的PTA的某些试题,我们NEUQ的学子确实深受其毒。

  • 首先:某些题目对输入输出有严格要求,比如你输出多打了个空格,就会判错
  • 题目数据有些玄学:貌似是不同的人有不同的数据,比如:一道题别人做就是对的,你和他用的一个方法,甚至把代码拿过来,也会判错噢;还有些题目没有数据范围,让人很难抉择申请的数组空间等。
  • 最后是O2优化,可以看到,PTA上今晚的题目支持34中不同的语言,其中C/C++支持四种不同版本的编译器,但不同的编译器版本对应的源码大同小异,这对于C刚学了一年的人来说却是难以抉择。今晚第二道题目时间限制100MS,数据量10e5那么对应的cin>>能过得去有些玄学,不过对于scanf("%d",&n);应该可以(我没试),对于C++的快读一定可以,第一次提交时间超限,那么写了个快读就可以过了。

如何优化C++的cin>>

某谷有中学生大佬这样写把CIN>>优化到和scanf大致一个速度,但数据量大了还是慢

#include <iostream>
using namespace std;
std::ios::sync_with_stdio(false);

关于C/C++的 _int64

有这样一道题:给出两个数字,求他们的和?求他们的乘积?

是不是很简单?可以试一试

加法:https://www.luogu.com.cn/problem/P1601

乘法:https://www.luogu.com.cn/problem/P1303

 

分类:

技术点:

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-06-11
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-08-11
  • 2022-12-23
  • 2022-12-23
  • 2021-09-12
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案