Logo PYB的博客

博客

常见易错问题汇总总结

2019-11-14 11:26:54 By PYB

写在前面的

本blog中将由PYB将常见的错误总结出来,请各位XDFZOIer选手,可在评论区回复PYB未总结到的,PYB将定期将其补充进去

编译问题

  1. #include<cmath>/<algorithm>却使用abs()及lower_bound()函数;

  2. 少写头文件(如<cstdio>),或写错头文件(如<Cstring>,#include<bits\stdc++.h>);

  3. 注意abs()函数的使用,其支持的类型有限,不要使用labs(long int),;

  4. itoa()/_itoa()函数在C库中被取消定义,不能使用;

  5. 头文件与变量名x1,x2,y1,y2,y0冲突,编译错误;

  6. 以防变量名与系统函数名冲突,可以变量名去掉元音字母;

  7. 读入$longlong$,输出却是print("%d")(可以通过开启“显示最多警告”加以解决),可加编译命令:-Wall -Wextra -Wl,--stack=536870912或者具体设置

  8. 看清楚编译命令,看是否开O2,是否开C++11,如果不开,不要使用C++11特性;

  9. 加了inline后因inline被高亮了,所以容易忘记加返回值类型,如:

    inline Abs(int x){return x<0?-x:x;}

低级错误

  1. 文件读写错误或注释掉,或"w""r"写反,或英文拼写错误,或".out"写成",out",".int", 以及文件读写的过程中"***.in","***.out",未写后缀名。 小tips:可以使用string类的加减操作(+".in", +".out")把freopen包装成一个函数使用,在主函数调用_open("文件名前缀")即可。)
  2. 输入数据中有n和m的,一定注意n和m的顺序(样例常常是相等的)
  3. 看清楚给定的是字符串还是整数;
  4. 写出正解,自己认为写错,没有调试直接交,编译错误。
  5. 输出大小写要注意,Yes,YES区别开。
  6. 在最后提交时,文件名粘贴复制时注意前后留存的空格。

运行超时

  1. 循环条件中使用$strlen()、sqrt()$函数,导致时间复杂度退化,超时。
char s[50000]; 
for(int i=0;i<strlen(s);i++)   *****;

这样写会造成超时。 改写为:

int  len=strlen(s);  for(int i=0;i<len;i++)  *******;
  1. 读取数据量很大时使用cin,导致超时。

答案错误

  1. 存数字的变量没有赋初始值(windows会赋值为0,Linux随机赋值);
  2. 结构体内的函数定义的变量要初始化。
  3. 快读写挂,建议不熟悉的人用scanf;
  4. 对于常见的模$1e9+7$,相加在$int$范围,相乘在$long long$范围。(@所有人)
  5. 一定要用大数据检验是否数组越界、乘法算术溢出;
  6. 多组数据忘记清空数组;
  7. 中间步骤计算量大,没取模,中间结果爆int/long long
  8. 计算结果为负数,直接取模将出错,考虑加一个模数的倍数,保证其为正后再取模。(@所有人)

运行错误

  1. 数组开小,RE;数组开大,超过空间限制;
  2. 数组调用过程中越界,下标为负数或超过数组定义范围;
  3. 大数组定义要放在主函数外面(map),大数组不能开在函数内部,取模要注意过程性(频繁)不能只给结果取模。容易爆;

算法逻辑

  1. if()…if()… else…结构不等价于if()… else if()… else…结构,逻辑错误;
  2. 如果手写哈希难度不是太大,建议别开map,$3e5$以上的数据容易被卡常;
  3. 最短路SPFA,入队要做入队标记,出队时要做清空标记;
  4. 使用某些数据结构时要check有没有在主函数内调用build()函数;
  5. 开数组时[maxn << 2]注意不要写成[maxn < 2](c++没有任何警告);
  6. 按位取反的时候需要先导0不取反,用((1<<len)-1) - 当前值
  7. 写分块等算法时,注意区分每个变量代表当前块还是当前位置,最好避免在代码中将两种变量先后取同一变量名,如都用i变量进行遍历;
  8. tarjan求scc时每次搜到一个点要入模拟栈;

玄学错误

  1. 注意:要用你熟悉的语句去, fin >> f[i] >> g[i++] ; 在linux下是错误的,windows下也有类似问题: 如有函数 cal(i), 当cout << cal (3) << cal (5) <<endl;,其实是先调用 cal(5)。
  2. g[t++]=g[t-1]多次使用t有时会出错,改写为:t++; g[t]=g[t-1];

评论

Misaka
前排赞美PYB!!!
Ayayayayayaya
前排滋磁
20210301
前排滋滋
C20192249
前排资瓷, 还有#include<bits\stdc++.h>
yx20201301
5th条其实可以用$$\mathbb{\href{}{\huge\color{blue}{for(register int i=0;ch[i];i++)233;}}}$$
yx20201301
Tarjan求scc时每次搜到一个点要入模拟贱
c20192138
前排滋滋
yx20201301
还有比赛时不要用C++11写法,如 register int a:array
c20192138
```cpp inline Abs(int x){return x<0?-x:x;} ``` 血的教训,函数没有返回类型,因为`inline`高亮所以不容易发现,Dev-c++开最高警告也没有任何警告
yx20201301
29th是只有开SegmentTree才会一大堆位移吧
c20192138
29th 在VS上直接编译错误:C2466 不能分配常量大小为 0 的数组
c20192138
两个取模后的数相减可能会出现负数,建议最后加上$mod^2$再取模保险
Manners
问题来了,atoi()能用吗?
yx20201301
有时编译器会自(xuán)动(xué)地优化一些代码,比如有时会把getchar()+(a=getchar())*0调换顺序
zark
fread buffer数组要开多大呀?
__ONE1__
中排滋磁
c20181605
滋磁,辛苦PYB了
LastYesterLong
数组越界Windows下会自动减你的变量值。。。比如数组模拟栈的时候,top大于数组大小的时候windows会自动减top....linux下直接爆炸,千万小心!
yx20201301
KMP要check在预处理时有没有更新前缀指针
yx20201301
注意在比赛时最好一开始就发现最大数据规模,要不然在比赛中间时可能有function内的变量没看到,特别是#define register rg 或#define register long long rll这种不会加粗

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。