- excrt合并模线性方程的时候,解不定方程获得的$x$,必定要弄小,不然容易在乘的过程当中炸掉long long
- 线性基取最大异或和的时候不必定包含全部基向量,而是回代后,全部数的异或和。
- 数组必定不能开小。读写未被分配的内存会发生奇怪的事情。好比在I/O中莫名奇妙Runtime Error
- 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)
- 要分清 for 的是$n$仍是$m$。
- memset 一个 boolean 数组不要写成 sizeof(int)
- 进考场的时候必定要核对机子的时间是否正确。被坑1小时的惨痛教训。
- 对负数进行“质因数”分解时注意绝对值。
- 线性基回代的时先处理低位。
- 二分的时候边界必定不要小了
- OJ上交题注意不要交错程序
- 后缀自动机的空间要开两倍
- OI赛制记得跑极限数据检查边界问题。
- 倍增取路径上的信息的时候,最终的向上跳的一步记得是拿两条边更新。
- 欧拉回路不必定通过全部点,而是全部边。
- 作完一题拍一题。 100 >= 100 * Math.random() (暴力很差写除外,但要用特殊数据检验。因此NOIP 3个半小时可难了)
- 对拍时记得 srand((unsigned) time (NULL))
- 考场上不要理会别人敲代码的声音,伪装他们都在敲假算法,会爆零。(虽然实际上他们可能ak了)
- 多项式求逆元两倍空间,多项式开根两倍空间。
- 多项式开根,求逆前记得清空数组
- 多项式开根,在求模$x^{n}$的意义下求逆元。
- 多项式操操做记得清数组,确保不会挂掉
- 动态插入凸包不能求最远点对
- 题读三遍,样例仔细看
- Splay每一个操做完成后检查是否执行splay操做,确保均摊没有假掉。
- 注意LCT的link操做的时候不要链接反了了,被makeroot的那个点连向另外一点
- pushDown时更新标记的状况下,上传的时候注意左右子树的标记有没有清掉
- 记得跑极限数据检查边界、常数、时间复杂度是否假掉、空间。
- 常备份源代码。
- 有$n$个点,不意味着暴力枚举与一个点相邻的点至多会枚举到$n - 1$个点。
- 须要分配标号时,$p_l p_r$须要考虑总方案数是否被正确计算。
- Tarjan的$low$不能乱改。
- 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 };
- 左移和右移运算中,偏移量不要超过位数-1.
- 树链剖分求lca比较的是链顶的深度
- 当方点只维护其儿子的信息时,主要它的父节点的信息。
- 分清有向边和无向边。
- 请手动类型检查:
#include <bits/stdc++.h> using namespace std; typedef bool boolean; multiset<int> S; int main() { // ...... S.upper_bound(1000000000000ll); return 0; }
- 最小生成环套树森林的并查集正确判断方法:
boolean check(int x, int y) { x = find(x), y = find(y); if (req == 1) return x ^ y; return !cir[x] || !cir[y]; }
- 建凸包要以纵坐标为第二关键字排序。