简介
众所周知,有些毒瘤题会卡时间,便有了此篇文章。
普通快读板子
读入整数
getchar()
比 scanf()
快,putchar()
比 printf()
快。
namespace io {
inline int read() {
int 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*10+c-'0',c=getchar();
}
return x*f;
}
inline void write(int x) {
char buf[40];
if(!x) {
putchar( '0' );
return ;
}
int tmp=x>0?x:-x;
if(x<0) {
putchar('-');
}
int cnt=0 ;
while(tmp>0) {
buf[cnt++]=tmp%10+'0',tmp/=10;
}
while(cnt>0) {
putchar(buf[--cnt]);
}
}
}
using namespace io;
读入字符串
原理同上。
inline string StringRead() {
string str;
char s=getchar();
while(s==' '||s=='
'||s=='
') {
s=getchar();
}
while(s^' '&&s^'
'&&s^'
') {
str+=s,s=getchar();
}
return str;
}
读入浮点数
前面处理多余字符和判断负数的方式与 int 相同,只是后面读入数字过程中要改变一下。我们引入两个变量 (n),(k) 和 (m),(n) 存储当前是读整数部分还是小数部分,(k) 表示小数部分的值,(m) 表示小数部分的长度(可省略,但为了方便阅读)。(这样写或许过于复杂?)如果读到小数点,便修改n的值,否则就看 (n) 的值来读入整数或小数。
最后返回答案时,直接将 (k) 转换为小数,然后加上整数部分,然后再决定是返回负数还是正数。
inline double DoubleRead() {
//double的值可能很大,所以开long long
long long s=0,w=1,k=0,n=0,m=0;
char ch=getchar();
//和int一毛一样有木有
while(ch<'0'||ch>'9') {
if(ch=='-') {
w=-1;
}
ch=getchar();
}
while((ch>='0'&&ch<='9')||ch=='.') {
//n = 0代表读入整数,= 1代表读入小数
if(ch=='.') {
n=1;
} else if (!n) {
s=s*10+ch-'0';
} else {
k=k*10+ch-'0',m++;
}
ch=getchar();
}
return (pow(0.1,m)*k+s)*w;
}
高级快读板子
原理:批量读入所有数据,因为硬盘 IO 比内存 IO 慢,所以能卡常。慎用!
using namespace std;
namespace IO {
char buf[1<<22],out[1<<22],*p1=buf,*p2=buf;
int p3=-1,f=0;
inline char getchar() {
return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;
}
inline void flush() {
fwrite(out,1,p3+1,stdout),p3=-1;
}
inline void check() {
if(p3>(1<<21)) {
flush();
}
}
inline void putchar(char a) {
out[++p3]=a,check();
}
inline void put(string s) {
int tmp=p3;
while (p3-tmp<s.size()) putchar(s[p3-tmp]);
}
inline char gc() {
char c=getchar();
while (!c||c=='
'||c==' ') c=getchar();
return c;
}
inline void getc(char *ch) {
char c=getchar();
int p=-1;
while(!c||c=='
'||c==' ') {
c=getchar();
}
while(!(!c||c=='
'||c==' ')) {
ch[++p]=c,c=getchar();
}
}
}