首先得声明……其实有时候快读快输也不比scanf或者printf快多少……
这是某大佬告诉我的,cin大约能支持输入输出100万的点,scanf大约是1000万,快读快输则是1亿,再快的话就用fread……然后还有大佬告诉我……有些题目会特意去卡read……所以各位谨慎使用……
#define C getchar() inline void read(int &s){ s=0; int t=1,k=C; for (;k<'0'||k>'9';k=C) if (k=='-') t=-1;//判断该数正负 for (;k>='0'&&k<='9';k=C) s=(s<<1)+(s<<3)+(k^48);//<<1加上<<3就相当于*10,但是位运算的速度较快,^48也相当于-‘0’,同理,较快。 s*=t; }
#define C getchar() template <typename T> inline void read(T &s){ T t=1; char k=C; s=0; for (;k<'0'||k>'9';k=C) if (k=='-') t=-1;//判断该数正负 for (;k>='0'&&k<='9';k=C) s=(s<<1)+(s<<3)+(k^48);//<<1加上<<3就相当于*10,但是位运算的速度较快,^48也相当于-‘0’,同理,较快。 s*=t; }我也不知道为什么)反正后面的加上了template 的比前面的跑的快一些……,然后贴上老刘的namespace……
namespace INIT{ char buf[1<<15],*fs,*ft; inline char getc(){return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;} inline int read(){ int x=0,f=1; char ch=getc(); while(!isdigit(ch)) {if(ch=='-') f=-1; ch=getc();} while(isdigit(ch)) {x=x*10+ch-'0'; ch=getc();} return x*f; } }using namespace INIT;
那么这些就是快读了……
然后是我自己写的两个快输,一个用递归写的,一个就是循环……
#define G(a) putchar(a+48) inline void write(int s){ if (s<0) G(-3),s=-s; if (s>9) write(s/10); G(s%10); }
#define G(a) putchar(a+48) inline void write(int s){ int t=0,a[40]; if (s<0) G(-3),s=-s; do { a[++t]=s%10; } while (t/=10);//用do while的原因是不用特判一个0 while(t) G(a[t--]); putchar('');//看题目需要,可以加入\n进行换行或者加入空格 }
看情况使用就好……再重复一遍……请选择合适的输入输出,比如几百个点用read也真是太费时间了吧……
ps:使用方法:比如要输入a,则直接read(a)即可,输出a就write(a)。