没啥,就贴个板子。
自从我们开始学 OI 以来,我们就接触了 IO。在 zsjz,老师会说:
大家读入数字都用这个:
cin>>n;
输出数字都有这个:
cout<在 zsyz,老师会说:
大家读入数字都用这个:scanf("%d",&n);输出数字都用这个:
printf("%d",n);效率上,肯定是后面的快,但是前面的如果只加上这一句,就可以和后面达到同样的效果:
ios::sync_with_stdio(false);但有些时候,两个都不行,于是我们开始学习快读。
inline int read() { int s=0;char ch=getchar(),last='0'; while(ch<'0'||ch>'9') last=ch,ch=getchar(); while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar(); return last=='-'?-s:s; }就这么一个板子,背了许多年了。然后发现,那个
s=s*10+ch-'0'可以写成
s=(s<<1)+(s<<3)+(ch^48)然后我们居然可以吧 getchar() 直接重定义宏,写成
char buf[1<<23],*p1=buf,*p2=buf; #define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)最后的终极快读就变成了这个样子:
char buf[1<<23],*p1=buf,*p2=buf; #define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++) inline int read() { int s=0; char ch=getchar(),last; while(ch<'0'||ch>'9') last=ch,ch=getchar(); while(ch>='0'&&ch<='9') s=(s<<1)+(s<<3)+(ch^48),ch=getchar(); return last=='-'?-s:s; }然后我所知道的快输自始至终就都是这个样子的:
int num[100]; inline void write(int x) { if(x<0) putchar('-'),x=-x;; int len=0; do num[len++]=x%10;while(x/=10); while(len--) putchar(num[len]+'0'); }上道例题:洛谷 U183572 【模板】快读快写
正解:#includeusing namespace std; char str[60000000]; int main() { gets(str); puts(str); return 0; }
呵呵呵



