查看: 92|回复: 0

[OI] 卡常宝典

[复制链接]

9

贡献

5

主题

58

积分

正式会员

积分
58
发表于 2026-6-29 23:31:09 | 显示全部楼层 |阅读模式
本帖最后由 FastLower 于 2026-6-30 00:18 编辑

卡常宝典
注:全文中的排序规则按效率从高到低,
部分资料来源于网络。
一、I/O 优化
1.输入:
fread > read> cin.tie(0) > scanf =cin.ios::sync_with_stdio(0)> cin
2.输出:
fputs > puts > cout.tie(0) ≈ printf > cout
\n > endl
二、常量与宏定义
1.规范性:
C++11及以后规定:
只读 -> const
常量 -> constexpr
2.效率:
define > 常量 > 只读量普通变量
三、数据类型
int > short > long long
float > double
bitset > bool
四、三目运算符 switch-case> if-else
注:对比条件数目大于3switch更优,并且对比条件数目越多时switch的优势越为明显。
五、位运算(更快)
1.   取模 → &
2.   乘 → <<
3.   除 → >>
4.   != → ^
5.   swap(a,b) → a^=b
六、提高缓存命中率(内存接近)
说人话就是令指针走的步数少一些,比如:
++a[1], ++a[2] > ++a[1],++a[100001]
显然,我们不可能告诉机器硬件是否需要清空并重新填充内存。
但我们可以尽可能减少访问缓存器外的元素。
比如在一段很长的循环中,只用为数不多的变量。
这样一来,就达到了提高命中率的目的。
七、自加自减
++i > i++,特别是在STL中,优势肉眼可见。
八、size()empty()
1.   size() 用于普通队列更快。
2.   empty() 用于优先队列更快。
九、循环展开
这个比较神奇。
比如说一个程序,原本时间复杂度是O(n^2)
但是如果你用一些高科技(如循环展开)也许能够跑完3*10^4 的数据!
例如:
for(int i=1;i<=n;i++)
{
        sum+=i;
}
未优化,耗时0.0000279秒。
for(int i=1;i<=n;i+=2)
{
        sum+=i;
        sum+=i+1;
}
初步优化,耗时0.0000159秒,将近快了一倍。
for(int i=1;i<=n;i+=2)
{
        sum1+=i;
        sum2+=i+1;
}
sum=sum1+sum2;
再次优化,耗时0.0000073秒,将近又快了一倍。
十、O1 O2 O3优化(简称:吸氧)
口诀:
臭氧氧气氧原子,
一口吸死评测机。
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#pragma GCC optimize(s)
超长火车头(有副作用,最好别用):
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
Fast↑Lower↓
查看帮助

相关侵权、举报、投诉及建议等,请按帮助内指引进行反馈

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部