欢迎同学们在下方发帖补充常见错误,互相督促,赛场不要出锅
致命错误——犯一条就零分
未按题目要求添加文件读写
未按题目要求输出结果
忘写头文件
C++万能头文件写错
主函数没有return 0
编译问题
没#include<cmath>/<algorithm>却使用abs()及lower_bound()函数;
少写头文件(如<cstdio>),或写错头文件(如<Cstring>,#include<bits\stdc++.h>);
注意abs()函数的使用,其支持的类型有限,不要使用labs(long int),;
itoa()/_itoa()函数在C库中被取消定义,不能使用;
头文件与变量名x1,x2,y1,y2,y0冲突,编译错误;
以防变量名与系统函数名冲突,可以变量名去掉元音字母;
读入,输出却是print("%d")(可以通过开启“显示最多警告”加以解决),可加编译命令:-Wall -Wextra -Wl,--stack=536870912或者具体设置;
看清楚编译命令,看是否开O2,是否开C++11,如果不开,不要使用C++11特性;
加了inline后的返回值因inline被高亮了,所以容易被忽略,如:
复制
inlineAbs(int x){return x<0?-x:x;}
低级错误
文件读写错误或注释掉,或"w"和"r"写反,或英文拼写错误,或".out"写成",out",".int", 以及文件读写的过程中"***.in","***.out",未写后缀名。 小tips:可以使用string类的加减操作(+".in", +".out")把freopen包装成一个函数使用,在主函数调用_open("文件名前缀")即可。)
输入数据中有n和m的,一定注意n和m的顺序(样例常常是相等的)
看清楚给定的是字符串还是整数;
写出正解,自己认为写错,没有调试直接交,编译错误。
输出大小写要注意,Yes,YES区别开。
在最后提交时,文件名粘贴复制时注意前后留存的空格。
建图千万不要手抖,图建错了后面算法再写也不会对。
调试信息、注释掉的语句正式提交前检查是否为最终版本。
存数字的变量没有赋初始值,快读写挂。
注意运算优先级问题,比如:!(a%b)和!a%b不等价,以及常错的位运算。
运行超时
循环条件中使用函数,导致时间复杂度退化,超时。
复制
char s[50000];for(int i=0;i<strlen(s);i++)*****;
这样写会造成超时。 改写为:
复制
int len=strlen(s);for(int i=0;i<len;i++)*******;
读取数据量很大时使用cin,导致超时。
bfs中多次入队,导致vector超过空间限制或者超时。
一些大数组能用int就不必用long long,后者会拖慢效率。
答案错误
存数字的变量没有赋初始值(windows会赋值为0,Linux随机赋值);
结构体内的函数定义的变量要初始化。
快读写挂,建议不熟悉的人用scanf;
对于常见的模,相加在范围,相乘在范围。(@所有人)
一定要用大数据检验是否数组越界、乘法算术溢出;
多组数据忘记清空数组;
中间步骤计算量大,没取模,中间结果爆int/long long;
计算结果为负数,直接取模将出错,考虑加一个模数的倍数,保证其为正后再取模。(@所有人)
ull与int或long long进行算术运算,结果出错;
两个double不能直接用==比较,需要相减取绝对值与eps(根据题目精度要求设置具体值,比如1e-8)
按位取反的时候先导0不会被考虑,用((1<<len)-1)-当前值。
运行错误
数组开小,RE;数组开大,超过空间限制;
数组调用过程中越界,下标为负数或超过数组定义范围;
大数组定义要放在主函数外面(map),大数组不能开在函数内部,取模要注意过程性(频繁)不能只给结果取模。容易爆;
取模时注意模数可不可能为0,除零也会RE。
算法逻辑
if()…if()… else…结构不等价于if()… else if()… else…结构,逻辑错误;
如果手写哈希难度不是太大,建议别开map,以上的数据容易被卡常;
最短路SPFA,入队要做入队标记,出队时要做清空标记;
使用某些数据结构时要check有没有在主函数内调用build()函数;
开数组时[maxn << 2]注意不要写成[maxn < 2](c++没有任何警告);
按位取反的时候需要先导0不取反,用((1<<len)-1)-当前值;
写分块等算法时,注意区分每个变量代表当前块还是当前位置,最好避免在代码中将两种变量先后取同一变量名,如都用i变量进行遍历;
tarjan求scc时每次搜到一个点要入模拟栈;
玄学错误
注意:要用你熟悉的语句去, fin >> f[i] >> g[i++] ; 在linux下是错误的,windows下也有类似问题: 如有函数 cal(i), 当cout << cal (3) << cal (5) <<endl;,其实是先调用 cal(5)。
g[t++]=g[t-1]多次使用t有时会出错,改写为:t++; g[t]=g[t-1];
超过空间限制
数组一般不要定义在函数内部,定义数组时注意所占用空间,若使用vector注意不要一直添加元素
数组占用空间计算方法,以int数组为例,一个int数据类型占用4个字节(Byte),则二维数组int num[5000][5000]占用空间 ,如果题目给的空间限制为128MB,则可以考虑定义这么大的数组。
long long类型:8字节; float类型:4字节;double类型:8字节;char类型:1字节。
注意
开O2对内存审查就更加严格,越界一个位置都要错,有同学const int N=1e7+5然后定义数组s[N/100],由于整除,实际上就刚好开了1e5。
考试的时候,对比自己的输出和大样例输出时,用cmd的fc来判断,本身fc是不忽略行末空格的,用fc /W可以做到忽略行末空格(by 许星宇)