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

输入输出优化

读取整数

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

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;
}

输出整数

适用于正负整数。

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

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

减少循环中不必要的计算

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

循环展开

减少不必要的循环次数。

References

CC BY-SA 4.0 在 OI 与 ACM 比赛中进行常数优化 by 小小泥娃的部落格 is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.

发表评论