首先得声明……其实有时候快读快输也不比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)。