一般来讲,快读快写在针对数据量不是很大的输入输出的时候显得比较无力,但如果是多组数据或者输入量较多,就可以显著提升效率。
快读
一个一个字符读取比读入一个数字(int)快
inline int read(){int x = 0, f = 1;//int型char ch = getchar();while(ch < '0' || ch > '9'){if (ch == '-')f = -1;ch = getchar();}while(ch >= '0' && ch <= '9'){x = (x<<1) + (x<<3) + (ch^48);//ch = getchar();}return x * f;
}
x = (x<<1) + (x<<3) + (ch^48):等价于 x = x * 10 + ch - '0'
简单来说移位就是二进制数左移(<<) 或 右移(>>) x位 十进制看来就是乘/除2
其中 x << 1 == x * 2;
x << 3 == x * 2 * 2 * 2;
二者相加也就是 x * 10;
异或,简单说就是 "同0 异1" 相同的两个数异或值为0 不同异或值为1
ch^48
相当于 ch -= '0'
快写
inline void write(int x)
{if(x<0){putchar('-');x=-x;}if(x>9) write(x/10);putchar(x%10+'0');
}