(转发一下我在某网站写的博客)
养成良好的代码习惯,从我做起。
闲来无事,开个新坑。点个赞吧亲~
也算是在我退役之前留下一些对后人有意义的东西了。
本博客记载一些比较通用的容易写挂的屑细节。
编译选项加 -fsanitize=undefined -Wextra -Wall
有效避免大部分错误。
TLE
- 多组数据不限组数只限制 \(\sum n\),却使用了
memset
清空。 - 没写快读,甚至使用不关闭流同步的
cin
读入。 - 没删
cerr
或者fprintf(stderr)
等调试语句。 for(int i = n ; i >= 1 ; ++i)
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)
- 某些神仙 OJ 不允许使用
- 你的数组是不是开得太大了?
- 定义了一些形如
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);
- 注意宏定义中,运算优先级的问题。
#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)