坑!

2018.2.28

  • excrt合并模线性方程的时候,解不定方程得到的$x$,一定要弄小,否则容易在乘的过程中炸掉long long

2018.3.2

  • 线性基取最大异或和的时候不一定包含所有基向量,而是回代后,所有数的异或和。

2018.3.4

  • 数组一定不能开小。读写未被分配的内存会发生奇怪的事情。比如在I/O中莫名奇妙Runtime Error

2018.3.5

  •  signed 是 signed int 的简写。
  • dinic的dfs中, (f = dfs(eu, min(minf, g[i].cap - g[i].f)) > 0) 是错误写法,正确的写法应该加上一组括号 ((f = dfs(eu, min(minf, g[i].cap - g[i].f))) > 0) 

2018.3.6

  • 要分清 for 的是$n$还是$m$。

2018.3.22

  •  memset 一个 boolean 数组不要写成 sizeof(int) 

2018.4.6

  • 进考场的时候一定要核对机子的时间是否正确。被坑1小时的惨痛教训。

2018.5.10

  • 对负数进行“质因数”分解时注意绝对值。

2018.6.30

  • 线性基回代的时先处理低位。

2018.7.14

  • 二分的时候边界一定不要小了
  • OJ上交题注意不要交错程序

2018.8.2

  • 后缀自动机的空间要开两倍
  • OI赛制记得跑极限数据检查边界问题。

2018.8.22

  • 倍增取路径上的信息的时候,最终的向上跳的一步记得是拿两条边更新。
  • 欧拉回路不一定经过所有点,而是所有边。
  • 做完一题拍一题。 100 >= 100 * Math.random() (暴力不好写除外,但要用特殊数据检验。所以NOIP 3个半小时可难了)
  • 对拍时记得  srand((unsigned) time (NULL)) 
  • 考场上不要理会别人敲代码的声音,假装他们都在敲假算法,会爆零。(虽然实际上他们可能ak了)

2018.9.25

  • 多项式求逆元两倍空间,多项式开根两倍空间。
  • 多项式开根,求逆前记得清空数组
  • 多项式开根,在求模$x^{n}$的意义下求逆元。

2018.9.29

  • 多项式操操作记得清数组,确保不会挂掉

2018.10.9

  • 动态插入凸包不能求最远点对

2018.10.17

  • 题读三遍,样例仔细看
  • Splay每个操作完成后检查是否执行splay操作,确保均摊没有假掉。

2018.10.19

  • 注意LCT的link操作的时候不要连接反了了,被makeroot的那个点连向另一点
  • pushDown时更新标记的情况下,上传的时候注意左右子树的标记有没有清掉

2018.10.20

  • 记得跑极限数据检查边界、常数、时间复杂度是否假掉、空间。

2018.11.5

  • 常备份源代码。

2018.12.8

  • 有$n$个点,不意味着暴力枚举与一个点相邻的点至多会枚举到$n - 1$个点。

2018.12.11

  • 需要分配标号时,$p_l p_r$需要考虑总方案数是否被正确计算。

2019.1.4

  • Tarjan的$low$不能乱改。

2019.2.17

  • NTT注意模数的两个地方:
    • 是否存在原根
    • $\varphi(p)$的2倍数的因子是否足够大
  • 非常降智的错误↓
     1 template <const int Mod = :: Mod>
     2 class Z {
     3     public:
     4         int v;
     5 
     6         Z() : v(0) {    }
     7         Z(int x) : v(x){    }
     8         Z(ll x) : v(x % Mod) {    }
     9 
    10         Z operator + (Z b) {
    11             return Z(((v += b.v) >= Mod) ? (v - Mod) : (v));
    12         }
    13         Z operator - (Z b) {
    14             return Z(((v -= b.v) < 0) ? (v + Mod) : (v));
    15         }
    16         Z operator * (Z b) {
    17             return Z(v * 1ll * b.v);
    18         }
    19         Z operator ~() {
    20             return inv(v, Mod);
    21         }
    22         Z operator - () {
    23             return Z(0) - *this;
    24         }
    25 };

2019.3.6

  • 左移和右移运算中,偏移量不要超过位数-1.

2019.3.10

  • 树链剖分求lca比较的是链顶的深度

2019.4.23

  • 当方点只维护其儿子的信息时,主要它的父节点的信息。
  • 分清有向边和无向边。

2019.4.27

  • 请手动类型检查:
    #include 
    using namespace std;
    typedef bool boolean;
    
    multiset S;
    
    int main() {
      // ......
      S.upper_bound(1000000000000ll);
      return 0;
    }

2019.5.7

  • 最小生成环套树森林的并查集正确判断方法:
    boolean check(int x, int y) {
      x = find(x), y = find(y);
      if (req == 1)
        return x ^ y;
      return !cir[x] || !cir[y];
    }

2019.6.11

  • 建凸包要以纵坐标为第二关键字排序。

2019.7.31

  • 求原根的时候记得判互素

2019.8.16

  • 记得检查数据分治有没有写挂
  • AC自动机向fail或从fail累加东西的时候别直接降智遍历pool。

2019.8.29

  • scanf解析非常慢,即使作为int读入7e6个1
  • 费用流多路增广当前弧优化不能丢,最好加vis标记,以及判断当前剩余流量为0时break

2019.9.24

  • 用不直接求出逆元的BSGS,记得最大要与处理到周期 + 块大小

2019.10.16

  • 两个数相乘的时候注意会不会越界。
  • 获得更大范围的随机数生成器的错误写法:

    int rand() {
      return ::rand() << 15 | ::rand();
    }
    

    正确写法:

    int rand() {
      const static unsigned msk = (1u << 30) - 1;
      return ((::rand() << 15) ^ ::rand()) & msk;
    }
  • 使用滚动数组请检查数组大小。

2019.10.20

  • 下发交互库可能啥也没有判,记得手动加上不合法的判断

2019.10.21

  • $\pm 10^9$ 记得检查是否爆 int

你可能感兴趣的:(坑!)