sb 错误

upd. 2020.11.29:今天刚想删了转到本地但是被评论感动了(

让带家见识一下我的 sb 程度((

  1. 判断形如 \(a\cdot b+c(c\ll a\cdot b)\) 是否爆 int / long long 时,不能只判断 \(a\cdot b\),要判断 \(a\cdot b+c\),因为 \(c\) 有可能是压死骆驼的最后一根稻草。
  2. 线段树节点要维护一大堆东西的时候,通常查询时返回节点,此时空节点与非空节点合并时不能想当然,要特判。
  3. set / map 等高级的 STL 容器一般很耗内存,ML 小的时候注意会不会爆,爆的话改成自己写的简单一点的 DS。
  4. 不能因为答案在 long long 范围内就忘取模;模数不能抄错,如 \(10^9+7\) 抄成 \(998244353\)\(10^9+9\)
  5. 一大堆 min / max / abs 时括号位置不能矬,可以用高亮检查。
  6. 不要胡乱将整型塞进有关 \(\log\) 的浮点函数里,可能会玄学爆精度。
  7. 维护一堆操作的题,如果维护的时候需要用到操作数 \(qu\),那么不能 while(qu--) 而要 for(int i=1;i<=qu;i++)
  8. \(it\) 是一个指针,要将它位移 \(a-b\) 位的话,要写 it+(a-b) 而非 it+a-b,那样可能会越界。
  9. 尽量不要将多个相关的函数写进一个表达式里,这样运算顺序可能是 UB。
  10. continue 写成 break / return
  11. 平衡树里上传时要更新 sz 而不能只顾更新其他信息。
  12. 看清楚数据范围,不要因为 \(n,q\) 同阶就认为它们相等,代码中写错变量上限而数组开小会 RE;或未注意到根据题意,数组大小应该是 \(2n\) 或其他关于变量上限的式子,而直接写变量上限。
  13. 多测 memset,爆零两行泪。
  14. 网格上的题要看清楚给定的是顶点坐标还是格子坐标。
  15. 开数组的时候把各数据范围弄混,如将 int a[N+1]; 写成 int a[X+1];
  16. 前缀和预处理时如果 i=0 则不能调用 Sum[i-1],可以手动平移一位或特判;同时注意调用前缀和时的越界问题(理论上越界合法,值为 \(0\))。
  17. 快读不能忘了可能会有负数。
  18. 如果想退出多重循环,一个 break; 是不行的,只能退出一层。
  19. 如果算法要求某个数组有序,而且这个数组靠直觉看也应该是本身就是有序的,但是题目可能偏偏不保证有序,而样例却又都是有序的。这时需要排序。
  20. two-pointers 的时候,如果要对某个数组从大到小扫,那么「将此数组从大到小排序」和「从后往前扫」中只能恰好选一个,如果两个都选就负负得正了。
  21. 手写队列、栈等时,head / tail / top++ / -- 是前置还是后置要想清楚。
  22. \(0\) 没有逆元。讲大一点就是如果一个运算有或没有逆运算那还好说,如果在值域里面有些值可逆,有些值不可逆,那就要当心了。
  23. 多测清空的最终目的是让每一次跑都如同第一次一样。有的时候光清空解决不了问题,比如下一个点依赖于上一个点的某些数据,而你却把它修改了,这时要还原。所以要把 //remember to clear 改成 //remember to make it first
  24. 注意极端数据(边界)。
  25. 循环变量重复定义(-Wall 也不会提醒),可能导致看似的灵异事件。比如处在一个很大的 for(i) 里面而忘记这层大循环,在里面循环变量也从 i 开始。
  26. 忘判无解。
  27. 带有减法和取模的题,最终不能忘了把答案转成非负数。
  28. min / max 的两个参数类型千万不能不相同,可能在某些编译器下通过,但在最终评测编译器下就会悲惨的 CE。
  29. \(n,m/h,w\) 混淆。
  30. 单调队列最好先 pushpop,否则可能新加进来需要被 pop 的元素。
  31. 逻辑运算符 & 位运算符优先级。
  32. 尽管离散化后值域大小等于 \(n\),但如果中途改变了 \(n\),值域大小可就不再等于 \(n\) 了。
  33. 有时候循环内部调用 a[i-1] 并且循环从 \(1\) 开始,这时候虽然大多数时候因为 a[0]=0 不会有问题,但有的时候就是会冲突,不能欠考虑。
  34. 下标从 \(0\) 开始还是从 \(1\) 开始?
  35. 中间结果爆 ll 而输入输出不会爆。
  36. 一个待输入变量还没输入就调用。
  37. 全局变量和局部变量重名,不会报错,但是会调到怀疑人生。(和第 25 条原理相似)
  38. 初始化函数写了一定要调用啊………………
  39. 1<<x 中若 \(x>31\) 会爆 int,要写 1ll<<x
  40. 通常对值域为 \(\N_+\) 的东西,会使用零值来表示没有值。但有的时候值域为 \(\N\),这时候用 \(0\) 就会出现错误,需要用 \(-1\)。甚至有的时候值域会是 \(\Z\),这时候要用 \(\infty\)
  41. 离散化忘记 unique,只 sort,这样正确性没影响,但是数据一大就会 T。
  42. 浮点转整型以及整型下的除法都是向零取整,如果想要下取整要分类讨论,如 toint 函数应该写 int(x+sgn(x)*.5) instead of int(x+.5)
  43. 负值跟某些我们希望是 signedunsigned(如 v.size())作比较会自动转成 unsigned 而出错,这时应该把式子里所有 unsigned 都强转成 signed
  44. 不会用 memset 就不要乱用(指填 size 处)。
  45. 数据有时会保证在 1e9 以内,并且要求对 998244353 取模,此时要注意到 \(998244353<10^9\),需要手动取模(但是 1e9 + 7 不会出现这样的问题/px)。
posted @ 2020-05-25 18:31  ycx060617  阅读(1122)  评论(3编辑  收藏  举报