然而只是个简单的整理而已 也就自己看看
大概是个备忘录的样子?
UPD on 2023/1/1 :
声明一下,这篇文章的内容可能有错误,请不要轻易相信,除非你已经写代码验证过了
为啥不修锅?因为我懒,,
就这样
- 处理多组数据时写
for ( ; T; --T)
最高效 - 短路运算、三目运算比
if
快 ++i
比i++
快,--i
比i--
快- 逗号运算符比分号快
- 取模
%
是最慢的运算 long long
的常数是int
的两倍- 访问数组元素比访问单个变量慢很多
int
是最快的,甚至比bool
还要快memset/memcpy
比for
循环赋值快很多- 用
define
实现min/max
容易造成重复计算,增大常数 - 访问最频繁的几个变量应该丢进寄存器
- 在浮点数运算中应尽量减少
/
的运算次数 1ll*x*y%P
比(ll)x*y%P
快- 若答案对一个
int
范围内的数取模,则绝大部分变量都不必开long long
- 尽量避免使用
STL
,sort
除外 - 一般
unordered_map
比map
快 - 合理使用位运算优化
*
,/
和%
- 不要使用
cin/cout
- 输出字符时
putchar
是很快的,输出字符串时puts
是很快的 - 若函数体内包含循环但循环次数很少,可以使用
inline
- 包含递归、循环(第20条情况除外)或者函数体较长的函数不要加
inline
strlen
的复杂度是线性的,最好把结果存到变量里使用clock()
测用时很准,但注意过多调用它也会影响程序效率- 慎用预处理,即使可以避免重复计算(理由见第7条)
- 尽量不使用
long double
,它的常数很大 - 浮点数除法很慢,应使用交叉相乘等技巧尽量减少除法运算次数
- 尽量紧凑关系密切的代码,即使这样会导致码长增加
- 写 FFT\rm FFTFFT 时应当预处理三角函数值(这属于第24条中的“慎用预处理”)
- 与第28条相反,写 NTT\rm NTTNTT 时不应预处理乘方值
- 不要相信网上流传的40行优化,其中大部分都很少起到作用
- Ofast\rm OfastOfast 优化是较为有效的一种优化(这不属于第30条中的“大部分”)
- 应尽量让小数组的大小能够卡进cache
- 在理论复杂度相同时,迭代实现往往比递归实现更快
- 在循环展开可能破坏代码的结构和可读性时,慎用循环展开
- 不应为简化代码而舍弃效率(第34条情况除外)
本文链接:https://my.lmcjl.com/post/7561.html
展开阅读全文
4 评论