警钟撅烂
-
慎用
memset
初始化。 -
数组空间要开够,用多个宏定义数组空间时,要分清楚是哪个常量。
-
图不连通时求所有强连通分量 tarjan 的时候应该写
for(int i = 1; i <= n; i++){if(!dfn[i]) tarjan(i);}
,不是tarjan(1)
。 -
多组数据数组要清空,同时注意输出要换行。
-
注意取模与除法后的数是否为 \(0\),有时需要特判。
-
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 分裂完后记得合并回去。
-
在平衡树中记得区分权值以及标号。
-
在线段树及平衡树中,不要忘了进行上传和下放操作。
-
Splay 每个操作结束后都要 splay 一次。
-
注意取模。
-
不要臆想一个数据的大小关系,该交换的时候要交换。
-
vector 存图的时候不一定要去重,有时候反而会因为此 TLE。
-
字符串拼接的时候一定要写
s += t;
,不能写s = s + t;
。 -
折半搜索注意两边的数组大小。
-
线段树合并时的写法应该与普通修改时的写法大致思路相同。
-
线段树合并的空间复杂度是 \(O(q\log n)\)。
-
点分治时必须用当前子树与之前的子树信息进行计算,不能都使用之前的子树信息。
-
虚树、点分树的根节点都不是 \(1\)。
-
取最大值时要步步取最大值。
-
离线操作时一定要开够存操作的数组。
-
开
long long
后要改Inf
的大小。 -
注意处理字符串时需不需要将开头下标改为 \(1\)。