Processing math: 3%

sb 错误

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

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

  1. 判断形如 ab+c(cab) 是否爆 int / long long 时,不能只判断 a\cdot b,要判断 a\cdot b+c,因为 c 有可能是压死骆驼的最后一根稻草。
  2. 线段树节点要维护一大堆东西的时候,通常查询时返回节点,此时空节点与非空节点合并时不能想当然,要特判。
  3. set / map 等高级的 STL 容器一般很耗内存,ML 小的时候注意会不会爆,爆的话改成自己写的简单一点的 DS。
  4. 不能因为答案在 long long 范围内就忘取模;模数不能抄错,如 10^9+7 抄成 99824435310^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 @   ycx060617  阅读(1196)  评论(3编辑  收藏  举报
编辑推荐:
· .NET Core GC计划阶段(plan_phase)底层原理浅谈
· .NET开发智能桌面机器人:用.NET IoT库编写驱动控制两个屏幕
· 用纯.NET开发并制作一个智能桌面机器人:从.NET IoT入门开始
· 一个超经典 WinForm,WPF 卡死问题的终极反思
· ASP.NET Core - 日志记录系统(二)
阅读排行:
· 在外漂泊的这几年总结和感悟,展望未来
· 博客园 & 1Panel 联合终身会员上线
· 支付宝事故这事儿,凭什么又是程序员背锅?有没有可能是这样的...
· https证书一键自动续期,帮你解放90天限制
· 在 ASP.NET Core WebAPI如何实现版本控制?
点击右上角即可分享
微信分享提示