易错点
务虚
-
注意观察题目中的性质,每一条性质都不是没用的,都可能是问题的突破口
-
长的阅读理解题,一定要耐着性子读完,提取主干,也不要忽略细节
-
一定要记得静态查错!!有的时候花费数小时调的错误,很可能几分钟的静态查错就能解决
WA
-
取模优化/int取模
1ll*a+b
,no 括号 -
memset 不能乱用,如果你的 sizeof 写错了, 可能会爆出随机数
-
记得把
INF
设到足够大 -
记得 时刻取模 ,有减法时记得先
+mod
再%mod
, 如果有必要需要读入后 立即取模 -
不要 盲目取模 ,尤其是计算 过程中 胡乱取模会 影响正确性 ,算完后最后 结果可以取模
-
注意 模数性质 ,是否为质数,数清楚有多少位,不要想当然
-
在 需要取模的快速幂 中,如果最后的 结果为
0
记得加上一个mod
,否则会出错 -
在 快速幂 中, 传参数记得类型 为
long long
否则可能会 爆long long
-
重载运算符 时要注意,
this.a<t.a
才是从小到大 -
指数不能直接取模!
-
快读时记得处理负数
-
树剖时记得分清楚第\(i\)个原数权值(
w
),和按dfn
顺序的权值(nw
) -
线段树
update
或pushup
或pushdown
时,不能仅更新sum
,应该更新全部信息,如min
、max
等 -
在 splay 的标记下传过程中,一定要先判断左右儿子是否存在,再对其翻转标记异或 \(1\)
-
Floyd算法枚举顺序:
k,i,j
-
左移或右移的优先级比 \(+\) 或 \(-\) 的低,
&&
比||
的优先级高 -
左右移位默认的类型是
int
, 记得转换成long long
再计算 -
\(1\) 默认类型是
int
, 运算时记得转换为1.0
或1ll
-
矩阵快速幂时
res
矩阵记得初始化, 使对角线为 \(1\) -
移位的时候记得注意数据范围,不要
-1>>1
-
输出
float double
时最好用printf("%f");
,而不是long double
的printf("%lf");
RE
-
开桶小心访问负下标!!
-
线段树开4倍空间
-
线段树
pushdown
时记得特判是否为叶子 -
DFS是树根的父亲尽量不要设成\(-1\),因为
fa[root]
可能会在LCA中用到导致RE
-
树状数组记得特判
0
的情况 -
分块时,最后块后面还要加一个右端点为
n+1
的块 -
n,m
的范围不代表数据范围 -
用
ios::sync_with_stdio(false)
后不要用scanf -
多组数据重新建边的时候记得清空 \(idx\)
-
更改了 \(\rm set\) 中元素后,小心迭代器 RE
-
\(\rm set\) 小心边界,判
s.begin()
和s.end()
TLE
-
不要随便用SPFA,看清题目要求,是否有负边权,是否是双向边,是否稠密或稀疏等
-
存图时记得初始化
memset(h,-1,sizeof(h))
-
没事别用
unordered_map
,稳定 \({\rm O}(n)\) 警告 -
矩阵乘法循环顺序:
i,k,j
或者k,i,j
-
在 dfs 中的各种奇怪错误可能是由某个你不希望在下次搜索被更改的量, 被改动了, 因此一定要注意自己变量的作用域
-
删除的时候要考虑链表优化,跳过没用的(已经删除的)!
-
\(\rm SPFA\) 判断负环的时候只需要判当前路径长度是否大于 \(n\)
CE
-
命名时避开
x1,y1,x2,y2
这些系统关键字 -
切忌用
int a[10000000]={0};
初始化大数组,否则会因为编译文件过大暴死
UB
-
int
类型的函数无返回值 -
访问负下标
-
编译选项开
-Wall
有助于避免UB
-
-fsanitize=address, -fsanitize=signed-integer-overflow
这些选项对UB
和RE
的排查都有帮助
高效做题
-
在遇到和逆元有关的题目时(比如求概率或期望),可以写一份转成
double
的副本,可以提高调试效率 -
写了
init
就要初始化,别忘了用 -
模数为\(0\)或者除数为\(0\)都可能导致
RE