- 数组开小。很容易 \(2 \times 10^5\) 或 \(10^6\) 就开成 \(10^5\),或者各种变量的数据范围混用,\(m \leq 5\times 10^5\),结果只开到了 \(n\) 的数据范围 \(10^3\)。(upd. 2020.8.31),upd 2021.2.6 又犯了一次。
- 多测不清空。算法中要用到 \(a[n+1]\) 结果只手动清到了 \(n\)。(upd. 2020.8.10)当然有的时候多测是修改一部分值,如 CSP-S 2020 T4,遇到这种情况就要检查每次询问结束 \(a\) 数组是否还原到了询问前的样子(upd. 2020.11.8)upd 2021.2.16 又犯了一次
- 忽略了一些比较隐蔽的条件。例如 APIO2020 T1 一开始忽视了 \(\sum f(k)^2 \leq 4\times 10^5\) 这个条件,以为是给部分分用的,结果就一直在想 \(n \log n\) 级别的算法,浪费了很多时间,事实上这隐含着 \(f(k) \leq \sqrt{4\times 10^5}\) 的条件。(upd. 2020.8.15)
- 把题目中的 \(a\) 与 \(b\),\(n\) 与 \(m\) 的含义搞反了,或者没看清读入顺序,明明是先 \(m\) 后 \(n\),读成了先 \(n\) 后 \(m\)。(upd. 2020.10.6)
- 写了个错误的程序对拍(upd. 2020.10.6)
- 碰到那种二维平面的题,“格子”与“格点”,以及坐标轴的方向搞错了。(upd. 2020.10.14)
- 想出了一些复杂度较高却又没啥办法优化的 dp 式子,然后就一直盯着它进行优化,可有时这种题偏偏不是 dp(upd. 2020.10.15)
- %lld 写成了 %d(upd. 2020.10.19)
- 二分上界开小了(upd. 2020.10.19)
- 注意 0 没有逆元,有的时候计数 dp 用到除法(除以另一个 dp 值)那基本上不太行的(upd. 2020.10.19)upd. 2021.7.6 其实是可以的,按照 SDOI 切树游戏 的套路来搞即可
- 考试最开始没有花时间把每道题都浏览一遍,导致有时候最后一题反而能拿些分的却没拿到。(upd. 2020.10.22)
- 没有对拍,或者对拍浪费了很多时间,导致该拿的分没拿到。最后与自己的预期相差甚远。(upd. 2020.11.1)
- 手写队列、栈等时以及莫队中,++ / -- 是前置还是后置要想清楚。(upd 2020.11.17)
- 多测的时候,有时候读到一部分数据就可以确定答案了,但此时你不能直接 continue,要把全部数据读完(upd. 2020.12.11)upd. 2021.10.21 差点又犯了一次,还好最后脑子比较清醒想了起来(
- 有的时候,值域 \(\leq 10^9\),而模数只有 \(998244353\),此时你就不能用直接加,大于 \(mod\) 就减去 \(mod\) 的方式取模(upd. 2021.1.12,这个是 csy 跟我讲的)
- 有时候点标号从 \(0\) 开始,进而会习惯性的 \(+1\),即
int u,v,w;scanf("%d%d%d",&u,&v,&w);u++;v++;
。结果把u++;v++
写到了scanf("%d%d%d",&u,&v,&w);
的前面。(upd. 2021.1.31) queue
忘pop
(upd. 2021.1.31),upd. 2021.2.18 又犯了一次,upd. 2021.6.28 梅开三度pw10,hash,pipe
在 linux 下是关键字,但在 windows 下测不出来,要格外注意(upd. 2021.1.31)- 内外层循环变量名取重了。这种情况即使开 -Wall 也测不出来(upd. 2021.1.31)upd. 2021.4.7 开 -Wshadow 似乎可以测出来
- 莫队记得先
push
再pop
,不然可能会出现一些奇怪的问题(upd. 2021.2.1) - 有的时候数组有用的下标不会越界,但可能会用到越界的下标,即使这些越界的下标没有用也要记得把数组开大,否则会出现一些奇怪的问题。(upd. 2021.2.1)(upd on 2021.10.22,有时侯比较明显的下标越界编译器会提示出来,譬如如果你循环到 2e5 数组只开了 1e5+5 它就会显示 iteration 100005u invokes undefined behavior)
- 读入中的变量名可能跟循环中的变量名重复(譬如 \(k,d\) 等)(upd. 2021.2.2)注:2021.2.6 又犯了一次该错误,线段树递归时的 \(k\) 与读入的 \(k\) 重复了。upd. 2021.4.7 开 -Wshadow 似乎可以测出来
- 要特别注意运算过程中爆 int 的情况,譬如如果 \(a\) 为 long long 型变量,\(b,c\) 为 int 型变量,那么如果你写
a*(b*c)
那么程序会先计算b*c
的值,就有爆 int 的风险。(upd. 2021.2.3) - 遇到与网格有关的题的时候,要特别注意是四连通还是八连通(upd. 2021.2.4)
- 冰茶姬忘了初始化(tips:如果实在忘记可以写
int find(int x){return (!f[x])?x:find(f[x]);}
)(upd. 2021.2.6) - 可撤销冰茶姬千万不能路径压缩(upd. 2021.2.6)upd. 2021.10.22 打线段树分治模板时又犯了一次(
- static 关键字修饰的变量与全局变量的唯一区别就是 static 关键字修饰的变量不能在局部域之外的地方被调用,否则会 CE。故如果你用 static 修饰的变量当作临时备份那么它在接下来几轮的递归中也会被修改,进而会导致 WA。(upd. 2021.2.7)
- 可撤销冰茶姬按秩合并的“秩”是深度,而不是树的大小,按大小来合并的叫“启发式合并”(upd. 2021.2.7)
- 有时候做计数题的时候要我们对 \(p\) 取模,有时候我们会特判掉一些情况(比如说 \(2\)),但你不能直接
puts("2");
,要printf("%d\n",2%p);
,经常有时候会有毒瘤出题人专门卡这个。(upd. 2021.2.15) - 三个 <998244353 的数加起来会爆 int(upd. 2021.2.16)
- (其实是 30 的扩展),有的时候计数题会写
ans=(ans-sum+MOD)%MOD;
,然后你发现自己式子推错了,不是减而是加,此时你不能只习惯性地把减号改成加号,而应当把后面的+MOD
去掉,因为三个 <998244353 的数加起来会爆 int(upd. 2021.2.16)upd. 2021.10.21 又犯了一次 - 把模数看错,1e9+7 看成 998244353(upd. 2021.2.16)upd. 2021.5.1 又犯了一次
- 当把一个数组赋上 -INF 时,以前习惯写
memset(dp,128,sizeof(dp));
,但实际上这样是不明智的,因为 0x8080808080808080 大约是 \(-9\times 10^{18}\),两个 0x8080808080808080 加起来会爆 ll。所以最好写memset(dp,192,sizeof(dp));
,这样两个加起来不会爆。同样道理最好也不要写memset(dp,127,sizeof(dp));
而改写memset(dp,63,sizeof(dp));
(upd. 2021.2.18) - 当你忘记运算符的优先级时最好多加几个括号,这样不会吃亏(upd. 2021.2.19)
- 敲 SA 的时候,数组长度有的时候不是 \(n\)(长度变量名为 \(m,k\) 或其它的),但总习惯性地敲成 \(n\)(upd. 2021.2.22)
- 变量类型一定要注意,不要出现
int
开成double
的情况,否则可能会让你调到怀疑人生(upd. 2021.3.13) - set 上定义的 "<" 一定要是严格偏序关系,也就是必须满足传递性,必须不满足自反性,否则可能会出问题。(upd. 2021.3.13)sort 里的 cmp 函数也是如此(upd. 2021.8.16)
- 当 \(x\) 超过
int
范围时,调用builtin_popcount
会出问题,需调用builtin_popcountll
(upd. 2021.3.15) - 对于结构体中含数组的,一定要记得手写构造函数清空数组,否则会出现奇怪的问题(upd. 2021.3.26)
- 对于字符串长度,比如说读入长度为 \(3\) 的字符串,数组长度千万不能只开到 \(3\),一定至少开到 \(4\),因为程序读入字符串后会自动在后一个位置填上
\0
,如果只开到 \(3\) 会导致数组越界(upd. 2021.3.26) - (其实也不能叫 mistake?)在 C++11 下交换两个 STL 是 \(\mathcal O(1)\),不开 C++11 下交换两个 STL 是 \(\mathcal O(\max(\text{STL 大小}))\) 的,这一点需注意(upd. 2021.3.27)
- 在写网络流的时候,一定要算好网络流的边数和点数的规模,不要随随便便地就将
MAXV
和MAXE
设为一个“感觉比较大”的值,比方说 2e5,这样有可能会 RE(upd. 2021.3.31) - 注意浮点数误差,碰到 double 的比较运算时,最好不要直接用
!= == < >
什么的,写个 EPS 比较大小(upd. 2021.4.1) - 带修莫队时间轴那一维指针,记得先更新贡献再移动指针(upd. 2021.4.1)
- IDFT 完后数组中的元素不要忘除以 \(n\)(upd. 2021.4.2)
- 在进行多项式 EXP 时一定要保证常数项为 0,否则会出现奇怪的问题(upd. 2021.4.2)
- 写矩阵乘法的时候一定要注意乘法的顺序(upd. 2021.4.5)
- 一定一定要看清楚部分分的数据范围,subtask 判断是否在数据范围内时不要判错(联合省选 2021 D2T3,upd. 2021.4.11)
- data 在 C++17 上是关键字,在 OJ 上提交时需注意(upd. 2021.4.23)
- 如果模数是 \(2\times 10^9\) 级别的,要注意加法溢出的可能性!!!!!(upd. 2021.4.24)
- 求 SCC 弹栈时一定要把对应节点的
vis
设为 \(0\)!!!111(upd. 2021.4.30) - 在二分 check 的过程中忘了清空(upd. 2021.5.8)
- 注意
set
的迭代器失效问题,具体可见这里(upd. on 2021.5.13)(upd. on 2021.6.30) - 对于那些濒临爆溢出的数,比方说 \(2000\) 个 \(10^6\) 级别的数相加(\(2\times 10^9\)),也要注意爆 ll 的可能性(upd. 2021.6.25,vp edu 89)
- 注意运算符优先级!(upd. 2021.6.30)
- 写 wqs 二分时注意斜率有可能为负,因此二分下界不能想当然地设为 \(0\)(upd. 2021.7.13)
- 注意
int
型变量不要错误地开成bool
(u1s1 感觉int
严格强于bool
?)(upd. 2021.7.29) - HDU 上 long double 不要 printf(其实大概不算 mistake,大概算 HDU 的 feature)(upd. 2021.8.10)
- 离散化不能只 sort,记得 unique,也要记得要在 unique 后的数组中 lower_bound(upd. 2021.8.11)
- 对于一个
int
型变量 \(x\),如果我们设了一个int
型的标记变量flg
,flg=1
当且仅当所有 \(x\) 都 \(\ne 0\),那么如果你写flg&=(x)
就凉透了,要写flg&=(x!=0)
(upd. 2021.8.11) - 有时候我们会用 \(0\) 表示空,但如果数的值域就包含 \(0\) 就不能用 \(0\) 了,得用 \(-1\),如果还包含 \(-1\) 就得用 \(\infty\)(upd. 2021.8.13)
- !!! 如果比赛不开 C++11,提交前记得检查是否有 C++98 禁止的东西,点名
vector<vector<int>>
、for(int x:g[u])
、[&](int x,int y){return dfn[x]<dfn[y];}
!!!!!(upd. 2021.8.22) - (大概也不能算 mistake)倍增把小的那一维放在前面会快不少(upd. 2021.9.29)
- LCT 一定要记得
pushdown
啊!!!!!!!(upd. 2021.10.11) unordered_map
空间常数很大,对于部分空间限制较小的题,使用unordered_map
有可能会导致 MLE(upd. 2021.10.22)- STL 的
size()
返回的是 unsigned,如果你那一个signed
减去一个unsigned
结果可能会溢出,这点需特别注意(upd. 2021.11.5)