1. 首先我们不能够这么写
for (register int i = 1; i <= strlen(s); ++i) { // s 为一个字符串
//My code Here
}
因为 strlen的复杂度是 $ O (n) $ 的,这样会让时间复杂度变成 $ O(n ^ 2) $ 的。下面这么些就是对的
int len = strlen(s); //s 为一个字符串
for (register int i = 1; i <= len; ++i) {
//My code Here
}
2. 关于 !
运算符:
!
运算符的优先级很高,所以在使用这个运算符的时候我们记得要在需要用 !
控制的条件边上加上个括号,以免因为优先级的问题出现乱七八糟的错误。
3. 关于文件输入输出:
考试的时候不要忘记文件输入输出。然后程序写完后一定要测试输入输出是否正常。之后我们不要把"XXX.in"或是"XXX.out"中的"."写成","!!!
4. 关于数据范围
一定要小心数据范围,尤其是关于数学的题目。这些题目的数据范围一般很大要开 long long
, 如果不开就可能导致无端丢掉 \(50\) 左右甚至更多的分数。
5. 关于连续相同子串
加入我们在解决连续相同子串的问题的时候,我们要注意最后一截子串,因为我们一般是按照当前的元素与前一个元素不同来判断一个连续相同子串是否结束,但是到了结尾这个时候就不能用这个方法判断当前相同连续子串是否结束,所以我们在枚举元素结束后要将最后一段还没有在循环中去更新答案的信息去更新答案。
6. 关于并查集
再第一次维护完并查集之后并查集中存的并不是每个结点所在的连通块的父亲。要在用 f[i] = get_f(f[i])
这种操作再更新一次 f[i]
之后 f[i]
存的才是每个结点所在的连通块的父亲。
7. 关于无向图/网格图宽搜
注意在标记走过的点的时候我们一定要先标记起点,然后再枚举出边的时候标记出边连接到的点,而不是标记当前结点。因为宽搜是先遍历深度一样的点,很有可能深度一样的点中有很多点能够到达一个当前结点能够到达的点,如果采用后面的标记方法,会使得标记步到同样能够被同深度的点访问到。然后要么陷入死循环要么让存结点的队列爆炸导致MLE
关于建图
建图的时候一定要小心不要有重边!!!