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