[
技巧
]
常见误区
- 尽可能使用位运算,
<<1
比 *2
快, >>1
比 /2
快,用 &1
代替 %2
,用三次 ^
代替 swap
,(x<<3)+(x<<1)
代替 x*10
- 尽可能把
i++
变成 ++i
,因为 i++
处理时会使用临时变量储存原先 i
的值
- 简单函数前使用
inline
,或者干脆使用 #define
,因为函数调用会浪费时间
- 字符串较短时使用
putchar
,较长时使用 printf
,但是如果要换行,一定要用 puts
- 数组尽量开奇数个(我也不知道什么原理)
- 使用
register
优化循环变量
- 手写函数,比如
max
abs
swap
等,还有 STL
if
语句比三目运算符要慢,逗号运算符比分号运算符要快
- 使用直接初始化
int maxn(-1)
代替复制初始化 int maxn=-1
std::pair
常数大
cin.tie(nullptr)
没有用
- 万能头,
using namespace std;
很慢
std::vector
常数巨大,不如链式前向星
- 结构体封装慢
while
比 for
快
正解
- 不要以为你比编译器更懂优化
std::ios::sync_with_stdio(false);cin.tie(nullptr);
- 运用
memset
和 memcpy
代替手写
- 使用
__builtin_popcount
等内建函数
- 采用 st 表小维放前面
- 并不是什么二维数组都是小维放前面快的
- 采用
std::__lg
代替预处理 log
或直接 log
- 必要情况下手写
std::bitset
会快
- 莫队可以采用奇偶性优化节省一半常数
- 不太会手写平衡树的用
pbds
,反正比我写的 FHQ_Treap 快
- 同理没有 O2 的情况下
pbds
的优先队列是更快的,开了不太确定
- 循环展开(没有 O3 的情况下才有用)
- 想想怎么剪枝更高效
- 更快的树状数组查询
int ask(int l,int r){int k=0;l--;while(r>l)k+=d[r],r-=r&-r;while(l>r)k-=d[l],l-=l&-l;return k;}
- 在没有
default
的 switch
,是比一个个 if
快的,采用了跳内存
- 没有
fread
或者 mmap
的快读还不如 cin
关同步