oier错误合集

Imakf

2020-08-08 08:56:13

Personal

养成良好的代码习惯,从我做起。 闲来无事,开个新坑。点个赞吧亲~ 也算是在我退役之前留下一些对后人有意义的东西了。 本博客记载一些比较通用的容易写挂的屑细节。 编译选项加 `-fsanitize=undefined -Wextra -Wall` 有效避免大部分错误。 ## TLE - 多组数据不限组数只限制 $\sum n$,却使用了 `memset` 清空。 - 没写快读,甚至使用不关闭流同步的 `cin` 读入。 - 没删 `cerr` 或者 `fprintf(stderr)` 等调试语句。 - `for(int i = n ; i >= 1 ; ++i)` - ```c++ for(int i = 1 ; i <= n ; ++i) for(int j = 1 ; j <= n ; ++i) // do sth ``` - 交互题要记得 `cout << flush` 或 `fflush(stdout)`。(感谢 WYXkk) - dfs 没判断 fa 无限递归(当然最后有可能会 RE、MLE)。(感谢 lndjy) - bfs 队列不 pop。 (感谢 abruce) - Dijkstra 堆建成大根堆。 (感谢 maruize) - …… ## WA - 如果多组数据交换两组数据的位置得到答案不一样:**多测不清空,爆零两行泪。** - 数据类型: - 你的函数传参有混用 `int`、`long long`、`double` 各种类型吗? - 你可能是被卡精度了,请减少浮点数的使用。 - 说到浮点数,你有写 `eps` 吗?或者说你定的 `eps` 是否合适?(有的时候 `eps` 过小也是会出问题的) - 你是不是浮点数运算输出了 `-0.000000`。 - 浮点运算算出了 `nan` 或者 `inf`。 - 最大最小值: - 最大值设成了 `0x3f`。 - 最大值不够大。 - 10000000007,1 << 62。 - 最小值设成了 `0`,(答案有可能是负数)。 - 快读你读入了负数吗? - 快读你 `return` 了个啥玩意,别告诉我 `return 0` 了。 - 没删调试语句。 - 你到底运行了自己的初始化函数没有…… - 你的数据分治的判断部分到底写对了没有…… - 你的**变量重名**了吗(尤其是与全局变量撞了)? - 注意输出格式,是空格还是换行;多组数据之间是否要额外换行? - 请注意 Windows 系统与 Linux 系统下 `rand()` 值域的显著差异。 - 滚动数组和刷表法连用你清空了上一轮的的 dp 值吗? - 多项式全家桶一定要记得清空数组啊啊啊啊啊啊啊啊啊啊!!!!!! - 求求你了,NTT/FFT 的时候千万别 `swap(i ,rev[i]);` - 请注意 dfs 时**在栈中**和**已访问**不是一个东西。 - 矩阵树定理,行列式交换要乘 `-1`。 - 取模 - 随手不取模,爆零两行泪。 - 两个 int 乘爆了 - 三个 long long 乘爆了 - 负数忘记取模后 +p 再模 p 了 - 注意对指数的取模是 $\bmod\ \varphi(p)$。 - 拓展欧拉定理的指数取模还要加上 phi(p),不加这个你就没了。 (感谢 Karry5307) - UB: - 如果同一组数据运行两次答案不一样:检查是否出现 UB。 - UB:`s[read()].push_back(read())`。 (感谢 RedreamMer) - 不要让赋值左右同时出现自增自减符号。 - `sort` 时有 `cmp` 不要忘记,有多个 `cmp` 不要混淆,重载了 `<` 更要小心。 (感谢 字幕君) - 注意考试/某些神仙OJ要求文件输入输出。 - 多测的时候,读入一半就直接完成特判 return,忘记读入该测试数据全部内容,导致输入错位。 (感谢 ducati) - 有多个**名字相近的函数**的时候不要调用错误,如 `dfs1(), dfs2()`。 (感谢 maruize) - splay(LCT) 上二分要记得 pushdown。 - 删调试语句的时候把输出答案也删掉了。 (感谢 ducati) - 输出 `unsigned long long` 的方法是 `%llu` 而不是 `%ull`。 - 注意二分答案的时候,`check` 函数的返回值到底是 `bool` 还是 `double/int`。 - 注意位运算优先级!!!(`&` > `^` > `|`) - 关闭流同步流混用 C 风格和 C++ 风格输入输出函数。 - …… ## CE - 我建议你先找台机子编译一下代码。(感谢 happydef) - 锅都是 OJ 的: - 某些神仙 OJ 不允许使用 `bits/stdc++.h`。 - 某些神仙 OJ 不能使用 `c++11`。 - 某些神仙 OJ 不允许你的函数与库函数重名(指 Atcoder)。 - 某些神仙 OJ 的神仙题卡语言,请确保您会这些语言再去做。 - 某些神仙 OJ 编译开了 -Werror,你的代码必须没有 Warning 才能过编译。(感谢 WYXkk) - **你的数组是不是开得太大了?** - 定义了一些形如 `time`,`y1` 直接的变量,与库函数重名。 - 库函数自带的 `max`,`min` 要求两个参数变量类型相同。 - `using namespace std` 和 `std::` 二选一。 - 重载了 `<` 用来 `priority_queue` 的话,要记得加 `const`。 - `const` 对象或者函数调用的函数也要是 `const` 的。 - 数组下标不能是浮点数。 - …… ## RE - 操作空指针 (nullptr)。 - 下标越界,数组开小。 - 注意有些维度可能是在值域上,而不是数组长度上。 - 除以 $0$,模 $0$。 - 线段树记得建树。 - 强制在线询问结果错误,导致解码后的数据超出下标。(实际上是 WA) - `scanf("%d",n);` (感谢 qidirj) - `printf("%d",&n);` - 注意宏定义中,运算优先级的问题。 ```cpp #define MX 100000 + 7 struct node{ int w ,lc ,rc; }pool[MX * 40]; ``` - 注意 sort 定义的 `cmp` 必须能严格区分两个元素的大小或相等关系,如果出环,将可能会 RE。(感谢 xiaolilsq) - …… ## MLE - 少用 `stack`,`deque`,`queue`,很占用内存,`vector` 占用空间比前面几个小。 - 少用指针多用数组。 - 注意宏定义中,运算优先级的问题。 - 减少不必要的 `long long` 使用。 - 函数记得写返回值,即便你可能根本没有用到。(UB 可能导致 MLE)