实现错误记录

  • 比较函数定义不严格,存在返回相等但是实际上有区别的情况。这可能导致双堆维护删除操作时出现问题。(应当同时弹栈但是栈顶元素不相等)
  • for (int i = 1; i <= n; i++) a[n] = inf
  • 在一些回溯时需要撤销操作的 dfs 中,因为其他原因 return 的时候没有撤销操作。
  • 循环/if 里层外层变量名混淆。
  • 进行 dfs / 递归时,因为使用全局变量下层 dfs 时破坏了上层之后要用到的信息。
  • 容斥时,只枚举了集合大小忘记了乘组合数。
  • 插头 dp 不要忘记连接两个左括号或者连接两个右括号的情况。
  • 树链剖分时,询问链的时候一定要注意是比较重链顶端深度大小,不能直接比较两个点深度大小。
  • sort 时忘记加比较函数。
  • 维护矩阵乘法时左乘右乘搞错。
  • 线段树合并时,如果要可持久化,空间要开两倍。
  • 在处理涉及不同长度字符串的字符串哈希时,一定要用 str[i] - 'a' + 1 而不是 str[i] - 'a'
  • 在处理子树最长从根开始路径之类的问题时,如果这个子树不能选,dp 值设为 \(0\) 仍会 +1 向上贡献
  • 在用 new 出来的数组时出现越界。这时不会报错,出现 new 出来的数组时,一定要谨慎计算每次调用的大小。(尤其是写多项式时)
  • 维护线段树区间加时,结果可能很大的时候 modify 函数参数不开 long long
  • 分块是数组恰好就开到和块数 / 块大小一样,导致越界。
  • 使用 lower_bound 在下标从 1 开始的数组上二分时仍然习惯性地加了 -1。
  • 找弱连通块时没有遍历反向边。
  • for (int i = 0; i <= vec.size() - 1; i++) 会导致错误,因为 unsigned 0 - 1 会溢出成一个很大的数,从而导致 i 遍历到很大。(并不是因为 unsigned 减法溢出会 RE)