新一代矩形快读快写工具箱,你值得拥有

· · 科技·工程

以下代码涵盖了整数、字符、字符串、甚至 pair 的快读快写(string 支持输入输出,C 风格字符串仅支持输出)。此外,你还可以直接调用 read(a, b, c);、write(a, b, c);、writeln(a, b, c); 等函数直接依次输入/输出 a, b, c,哪怕这三个变量是不同类型的;并且输入函数会返回一个 bool 值表示是否输入成功,用于解决部分不会直接给出多测组数的题目。

:::info[源代码]

char buf[1 << 20], *p1 = buf, *p2 = buf;
#define gc() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 20, stdin), p1 == p2) ? EOF : *p1++)

namespace IO { bool read(int &x) { x = 0; char c = gc(); bool f = 0; while (!isdigit(c)) { f |= c == '-';
if (c == EOF) { return 0; } c = gc(); } while (isdigit(c)){ x = (x << 3) + (x << 1) + (c ^ 48); c=gc(); }
if (f) { x=-x; } return 1; } bool read(string &s){ s = ""; char c=gc(); while (!isprint(c) || isspace(c))
{ if (c == EOF) { return 0; } c = gc(); } while(isprint(c) && !isspace(c)){ s+=c; c = gc(); } return 1; }
bool read(char &c) { c = gc(); while (!isprint(c) || isspace(c)){ if (c == EOF) { return 0; } c = gc(); }
return 1; } template < typename T, typename U > bool read(pair<T, U> &x) { if (!read(x.fi)) { return 0; }
return read(x.se); } template < typename T, typename ... U > bool read(T & x, U &... y) { if (!read(x)) {
return 0; } return read(y...); } void write(int x) { if(x < 0){ putchar('-'); x = -x; } string s = ""; do
{ s += x % 10 ^ 48; x /= 10; } while(x); for (int i = s.size() - 1; ~i; i--) putchar(s[i]); } void write(
char c) { putchar(c); } void write(const char *s) { while(*s) putchar(*s++); } void write(string x) { for
(char c : x) putchar(c); } template <typename T, typename... U> void write(T x, U... y) { write(x); write
(y...); } template <typename T, typename U> void write(pair <T, U> &x) { write(x.fi); putchar(' '); write
(x.se); } template <typename T, typename... U> void writeln(T x, U ... y) { write(x, y...); puts(""); } }

:::

你可能会问,这样的快读快写模板不是已经烂大街了吗?但这个 namespace IO 在宽度足够的编辑器里是一个矩形。下图为洛谷专栏编辑界面“仅预览”模式的显示效果。

除此之外,我们注意到在 \n 换行模式下,若选中整个 namespace IO(含最后一行末尾的换行符),那么你选中了 1378 个字符;在 \r\n 换行模式下,若选中整个 namespace IO(含最后一行末尾的换行符),那么你选中了 1391 个字符。

原理:控到每行均为 105 个字符(不含换行符),且恰好有 13 行即可。

唯一美中不足的是如果每题都用这样的类火车头状物,那么你在签到题的代码长度大概是鹤立鸡群的存在,比较引人注目。