有些题目追求高性能(比如说Θ(nlogn))
这个时候根据情况使用线段树、树状数组、记忆化搜索或者搜索剪枝很重要,但是不要忘记快读
一般来说scanf和printf的速度已经很令人满意了,虽说比不上pascal里面的read…
在读入大量数据的时,比如10^7个int型的整数,scanf也显得力不从心
——快读闪亮登场——
getchar()的速度很快了吧,那就用它一个个的读取字符,再把他们拼接成整数
快速读入
int read()
{
char ch=getchar();
int a=0;
while(ch<'0'||ch>'9') ch=getchar();//特别不喜欢这里用for()来压行..看着不舒服...
while(ch>='0'&&ch<='9')
a=a*10+ch-'0',ch=getchar();
return a;
}
然后调用是这样的..
int x;
x=read();
也可以引用调用直接修改变量的值,不知道哪个更快一些qwq..
void read(int &a)
{
char ch=getchar();
while(ch<'0'||ch>'9') ch=getchar();
while(ch>='0'&&ch<='9')
a=a*10+ch-'0',ch=getchar();
}
然后这么调用
int x=0;//不要忘记赋初值
read(x);
附读出优化
void write(int a)
{
if(a<0)
{
putchar('-');
a=-a;
}
if(a>9) write(a/10);
putchar(a%10+'0');
}
完整代码
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int read()
{
char ch=getchar();
int a=0;
while(ch<'0'||ch>'9') ch=getchar();
while(ch>='0'&&ch<='9')
a=a*10+ch-'0',ch=getchar();
return a;
}
void write(int a)
{
if(a<0)
{
putchar('-');
a=-a;
}
if(a>9) write(a/10);
putchar(a%10+'0');
}
int main()
{
int x=read();
write(x);
putchar('\n');//putchar好像是比printf快吧..
return 0;
}
看到了一个特别好的内联函数的讲解(inline)
嗯 没错 这是链接 戳