常见误区

  1. 尽可能使用位运算, <<1*2 快, >>1/2 快,用 &1 代替 %2,用三次 ^ 代替 swap(x<<3)+(x<<1) 代替 x*10
  2. 尽可能把 i++ 变成 ++i,因为 i++ 处理时会使用临时变量储存原先 i 的值
  3. 简单函数前使用 inline,或者干脆使用 #define,因为函数调用会浪费时间
  4. 字符串较短时使用 putchar,较长时使用 printf,但是如果要换行,一定要用 puts
  5. 数组尽量开奇数个(我也不知道什么原理)
  6. 使用 register 优化循环变量
  7. 手写函数,比如 max abs swap 等,还有 STL
  8. if 语句比三目运算符要慢,逗号运算符比分号运算符要快
  9. 使用直接初始化 int maxn(-1) 代替复制初始化 int maxn=-1
  10. std::pair 常数大
  11. cin.tie(nullptr) 没有用
  12. 万能头,using namespace std; 很慢
  13. std::vector 常数巨大,不如链式前向星
  14. 结构体封装慢
  15. whilefor

正解

  1. 不要以为你比编译器更懂优化
  2. std::ios::sync_with_stdio(false);cin.tie(nullptr);
  3. 运用 memsetmemcpy 代替手写
  4. 使用 __builtin_popcount 等内建函数
  5. 采用 st 表小维放前面
  6. 并不是什么二维数组都是小维放前面快的
  7. 采用 std::__lg 代替预处理 log 或直接 log
  8. 必要情况下手写 std::bitset 会快
  9. 莫队可以采用奇偶性优化节省一半常数
  10. 不太会手写平衡树的用 pbds,反正比我写的 FHQ_Treap 快
  11. 同理没有 O2 的情况下 pbds 的优先队列是更快的,开了不太确定
  12. 循环展开(没有 O3 的情况下才有用)
  13. 想想怎么剪枝更高效
  14. 更快的树状数组查询 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;}
  15. 在没有 defaultswitch,是比一个个 if 快的,采用了跳内存
  16. 没有 fread 或者 mmap 的快读还不如 cin 关同步