-
慎用
memset
初始化。 -
数组空间要开够,用多个宏定义数组空间时,要分清楚是哪个常量。
-
图不连通时求所有强连通分量 tarjan 的时候应该写
for(int i = 1; i <= n; i++){if(!dfn[i]) tarjan(i);}
,不是tarjan(1)
。 -
多组数据数组要清空。
-
max
和min
函数只能有两个参数。 -
next_permutation
里最好不用结构体,否则没写好可能会漏情况。 -
函数内部的变量和全局变量不要重名。
-
注意
long long
和unsigned long long
的空间限制以及符号限制。 -
注意一些程序的大常数。(补:尤其注意 STL)
-
多次求高精度的时候里面的数组要清空。
-
不要用 dij 求最长路。
-
memset
里面不要再填sizeof(0)
。 -
结构体排序的时候看清楚
cmp
里面填的应该是结构体的哪个参数。 -
二分某个数字出现的区间的时候,结尾点是
upper_bound(a + 1, a + n + 1, x) - a - 1
,不是upper_bound(a + 1, a + n + 1, x) - a
。 -
线段树带乘法操作时,加法标记也要乘上 \(val\),同理下放标记的时候也应该先将子节点加法标记乘上自己的乘法标记再加自己的加法标记。
-
改代码的时候如果有相同程序,记得一起改掉。
-
I/O 数据较大时,一定要用
\n
而非endl
。 -
离散化时要写
lower_bound(t + 1, t + k, a[i]) - t
而非lower_bound(t + 1, t + n + 1, a[i]) - t
。 -
使用树状数组时不能出现下标为 \(0\)。
-
树状数组进行覆盖式的单点修改操作时,可以利用原数组记录每次修改后的结果,利用这个数组进行修改操作。
-
线段树要开**至少四倍空间。
-
没有给出严格值域限制,同时还要运用权值数据结构,最好先进行离散化。
-
读入图的时候分清楚点数和边数。
-
ST 表先枚举第二维再枚举区间起点。
-
建树的时候要建双向边。
-
Lca 最后返回的是
fa[x][0]
,不是x
。 -
如果要排序,把信息处理放在排序之后。
-
搜索必剪枝。
-
高斯消元的时候要在交换之后在判断系数是否为 \(0\)。
-
化简的时候不要把符号抄错。
-
高斯消元的时候所有的数据类型都要设成
double
而非int
。 -
把调试的输出删干净了再提交。
-
用试除法的时候(包括但不限于筛法,判素数等)一定要以
i=2
为起始。 -
求欧拉函数时应该是
res = res * (i - 1) / i;
而非res *= (i - 1) / i;
。因为复合运算符优先级要低于除法运算。 -
tarjan 时候把元素弹出栈时,一定要把
ins[i]
置为 \(0\)。 -
有初始化函数一定要记得运行初始化。
-
注意取模的各种细节。
-
不要把堆和平衡树混为一谈。
-
dijkstra 时要把边权放在
pair
的第一维。 -
矩阵乘法不满足交换律
-
求矩阵快速幂时,
res
只将主对角线上的元素设为 \(1\)。 -
注意 Trie 的空间消耗。
-
在考试中开 O2 的情况下,如果出现没有返回值的非
void
函数会炸 -
看好数据范围后再做题!
-
矩阵乘法要注意初始化。
-
有重边、有自环的图不能有邻接矩阵存。
-
分块不要忘了写
ed[sq] = n;
。 -
注意 c++14 的各种关键字和系统函数。
-
FHQ-Treap 分裂完后记得合并回去。