在 OI 与 ACM 比赛中进行常数优化

输入输出优化

读取整数

适用于正负整数。

注意:在 C 与 C++ 中函数的求值顺序是不确定的,当多个参数需要调用输入输出挂时,必须引入中间变量。

1
2
3
4
5
6
7
8
9
10
11
inline long long LL()
{
char c;
bool neg = false;
while((c = getchar()) < '0' || c > '9')
neg = c == '-';//等价于 neg = (c == '-'),因为 == 的优先级更高
int a = c - '0';
while((c = getchar()) >= '0' && c <= '9')
a = a * 10 + c - '0';
return neg ? -a : a;
}

输出整数

适用于正负整数。

1
2
3
4
5
6
7
8
inline void Out(long long n)
{
if (n < 0)
putchar('-'), n = -n;
if (n >= 10)
Out(n / 10);
putchar(n % 10 + '0');
}

前置 ++

使用++i代替i++。不过现在大部分编译器已经会将i++优化为++i了,所以一般不用处理。

关闭同步

由于scanf(), printf()的格式化字符串操作是在运行时解析的,因此取消同步后使用cincout进行处理可以获得更快的速度。

注意:此时不可以再混用scanf()cin, printf()cout

1
2
std::ios_base::sync_with_stdio(false);
std::cin.tie(0);

减少循环中不必要的计算

例如,将for循环头部的strlen()的计算引入中间变量,有利于提高程序的运行效率。

循环展开

减少不必要的循环次数。

References