OI常见错误总结

OI常见错误总结

WA

  1. 多测未清空!!!
  2. 2020年11月7日以前:没开long long见祖宗
    2020年11月7日至2020年12月5日:没开unsigned long long见祖宗
    2020年12月5日后:没写高精见祖宗
  3. 两个int相乘前面没写1ll*而爆long long
  4. 多个int进行乘除一般来说先乘后除
  5. 出现取余运算时若使用减法需要加上模数再取模,防止答案变为负数
  6. 出现取余运算时不能直接进行除法(黑科技:对于任意模数m mm,计算x / 2 x/2x/2m mm的余数(前提是在不取模的意义下x / 2 x/2x/2是整数)时可以先计算出x m o d 2 m x\bmod 2mxmod2m的值,然后除以2 22后再模m mm,证明略)
  7. 浮点数掉精度(如a = b a=ba=b,而a b \frac{a}{b}ba计算完后略大于1 11,导致acos(a/b)返回nan
  8. abs只能是返回整数(输入浮点数会输出0 00),std::absfabs才可以返回浮点数(如果你的程序里有using namespace std;就没事了)
  9. a*=ba=a*b更容易爆精度
  10. 调试代码没去掉(为啥我会犯如此zz的问题啊……
  11. 文件输入输出打错(如著名的“travel4”)
  12. 写带结构体的STL的时候比较函数没有比较第二维(使用STL的pair就不会有这个问题)
  13. bool1+1=1我也不知道为什么,还有1*2=1(《关于yhc调代码调了半天发现自己数组开成bool这件事》)
  14. 未定义行为:连续等号赋值的同时其中一个变量++--等(如a[na++]=b[na]=c
  15. doubleint要分清,如int eps=1e-8显然有些问题
  16. for的内部记得打对,如for(int j=1;j=n;i++)有两处错误
  17. 模数为1 0 8 + 7 10^8+7108+7998244853 998244853998244853等诡异的数
  18. v.size()的类型为unsigned,要将其转化为int,否则v.size=0v.size()-1=2^32-1
  19. 树剖中单点修改应该修改dfn[x]而不是x
  20. 线段树覆盖的下传标记和加的下传标记不冲突且在下传覆盖的标记时要清除加的标记
  21. 不能同时用+=(...+...)%MOD,如:a+=(a-b+MOD)%MOD就错了
  22. 并查集判断两个点是否在一个集合中的时候是faa!=fab而不是a!=b(我是伞兵
  23. 求子树大小的时候初值为0 00
  24. 哈希建议使用多模数

CE

  1. C++14下似乎不能用register
  2. 结构体末尾没打分号提示invalid declarator before ...
  3. 建议加上-Wall编译选项以防神奇错误
  4. 使用#delfine int long longmain()前应使用signed
  5. C++14gets似乎会报错,可以用getlinewhile(scanf("%c",&c)!=EOF&&c!='\n'&&c!=' '&&...) ...代替
  6. 警惕变量名:y1hashnexttime
  7. 文件输入输出记得加#include<cstdio>

TLE

  1. 模数没开const(我也不知道为啥这个会超时,特别是在写多项式的时候)(梅开二度
  2. 输入输出较多时使用scanfprintf
  3. 多测中若∑ n \sum nn有限制,不能直接使用memset,否则可能会T
  4. strlen效率为Θ ( n ) \Theta(n)Θ(n),建议不要在for循环的条件中写strlenvector等STL容器大小函数也一样,一般图论广搜的while条件中建议使用!q.empty()而不是q.size()
  5. STL容器中的lower_bound函数比普通的lower_bound会更快

MLE

  1. 栈空间用多了?
  2. STL容器中插入了过多的元素(在一个会向STL插入元素的循环中死循环了)

RE

  1. 倍增时数组超界(已经梅开二度了
  2. 线段树没开四倍
  3. 邻接表有无向边时未开二倍
  4. 注意检查数组大小是否少打一个0惨痛教训,我也不知道为什么没有RE……)
  5. 弹出栈的时候没有判断栈是否为空
  6. 1 0 6 10^6106内的两个数异或后可能超过1 0 6 10^6106(要考察有多少二进制位)
  7. 数组大小要比遍历的范围大
  8. 警惕二分的各种死循环

其他

这里写一些不太算是错误的错误:

  1. 对拍(或其他时候)生成伪随机数请勿用rand()*rand()%n这种奇怪的方法(原因是生成出的伪随机数不均匀),要的话请用for(int i=0;i<=60;i++) x|=((rand()%2)<<i)生成随机long long后再取模

版权声明:本文为weixin_43849488原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。