[
技巧
]
常见误区
- 尽可能使用位运算,
<<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 关同步