Misaka2298 在程序设计竞赛中常犯的错误
Misaka2298 在程序设计竞赛中常犯的错误
用来记录一些我写题 / 模拟赛时犯过的一些奶龙错误。
部分是之前在其他平台整理过的。
有些错我没犯过,但是怕我在正赛奶龙所以也写上了。
做题杂项
- 好 好 读 题。
- 做 题 别 急。
- 写 代 码 带 脑 子。
- LONG LONG.
- 做题不要用很不具备一般性的样例推结论,要用题目抽象出来的形式化题面推结论。不然会死的很惨。
- 多 测 清 空。
- 别 忘 了 cin。
- 做题要仔细把每一个字都读到,不要想当然,不要猜。
- 数组开大一点,这个很难 debug 到,开小了有时候还不给你报错。
- 检查 freopen!!!!! 小心打错字,英文 "." 打成 "," 的情况。
if,for,while后面不要写分号。- 小心不小心写出变量遮蔽,不要在
for(int i)里写for(int i). - 小心 \(i\) 和 \(j\) 写反。
- 慎用
std::memset(),不确定时就手写std::fill()。 随手写一个cppreference 说了不用,但是最好还是写一下。return 0;,不要相信编译器,会死的很惨。(老实讲我也不知道正赛不写return 0;会不会死,但是我不敢赌。)- NOI系列赛事中大部分都用
-std=c++14,少学点 17 和 20 的特性。 - 相信 T1 和 T2 是可做的,要尽力去写,多去推结论。
- 多去看数据范围,不要感性理解一个算法“可不可行”,有时看起来很错很蠢的算法算一遍复杂度最后是对的,有一个思路之后一定要去算时间复杂度,不然可能错过正解。
- 就算看不懂题,也要观察一下样例,有时可以发现一些有意思的性质。
.size() 和 .length()`每次调用都是 O(size) 的,如果确定长度是固定的话用一个变量存下来后直接 O(1) 求的时间复杂度会更优。(在 C++11 以上已修复)- 答案之间要求输出空格的,不要输出换行,答案之间要求输出换行的,不要输出空格。
- -1 在 C++ 中表示 \(True\),切记切记。
- 看清数据规模,别冲完发现假了。
- 看清输入格式,有时输入行数不等于 n 或 m 而是他们的 +1 或 -1。
- 一定要去算空间,MLE 会死的很惨。
对于这一点,可以:"使用cout << sizeof(arr) / 1024 / 1024; 看数组占用大小来防止 mle",单位为 MB。
(来自OI中常见错误及策略) - 要去好好算你的数组应该开多大,不要感性理解。在能接受的范围内,数组开大一点会更稳。
- 小心样例诈骗,不要迷信大样例,多造极限数据,必要时对拍。
样例对 \(\neq\) 真的对,有时候一个错误的算法也能让样例对。 - 如果最后结果是相减再输出,且要求取模,一定要
(a - b + mod) % mod,否则会输出负数。(尽管这在数学意义上是对的) - 在对代码进行任何修改后都要过编译过样例,就算你只是删了一些注释或者括号。
- 不要吝啬你的大括号,有时你的大括号写少了会导致很神秘的未定义行为出现。
- 敬畏数据范围,一定要觉得数据范围里可能有的数在数据里一定会有。
如:\(0 \le x \le 100\),在你的代码里有a / x,不要想当然的以为出题人不会给你 \(x = 0\) 的数据,一定要去处理所有的可能。数据范围一定要是数据的范围!
- 子序列 是可以不连续的,子串 是必须连续的。
图论
- 链式前向星存图的时候记得
memset(h, -1, sizeof h);!!! - 链式前向星存无向图记得开 2 倍数组。
- 链式前向星存带权图时,加边别忘了
w[idx] = c;。 - \(SPFA\) 中不要忘了
while()前把st[sta] = 1,每次q.pop();后记得把st[t] = 0;。 - 链式前向星中,遍历边用
i = ne[i]而非i++。 - 二维数组 / 邻接矩阵中,注意下标坐标系的原点为左上角,与之相应的下标操作也要与平常的坐标表示区分开。
- 警惕样例中 \(n=m\) 的情况!这可能会导致这种输入边时 \(n, m\) 搞混的灾难:
for(int i = 1 ; i <= n ; i ++)
{
int a, b, c;
cin >> a >> b >> c;
addedge(a, b, c);
}
- 并查集统计连通块中点的数量时查询某个点时记得把这个点的祖宗找到再输出 \(size\),更新 \(size\) 时更新的是祖宗的 \(size\),所以一切查询都应该在祖宗下进行。(犯了两次)
- 小心图论题先输入 \(m\) 后输入 \(n\),好好看输入格式。
动态规划
- 一定要初始化!!!!!!!! 好好去想想该初始化什么!!!(常见的动态规划模型的初始化总结)
字符串
- \(KMP\) 里搜索模式串在主串中出现位置时记得 \(i\) 的上界是主串长度,绝对不是模式串长度!!!
- \(KMP\) 的 \(j\) 是从 0 开始枚举的!不然会 TLE。(犯了两次)
数学
- \(1\) 不是质数。
- 快速幂中,\(a\) (底数)要开 \(long long\) 来避免自乘时爆精度。
杂知识点
高精度
- 记得把大写数组和小写数组分开。
- 传参传指针。
- 高精乘的循环有
|| t. - 记得去掉前导零。
- 高精除是正着做的。
- 高精乘除中有一个数是低精度。

浙公网安备 33010602011771号