sb 错误
upd. 2020.11.29:今天刚想删了转到本地但是被评论感动了(
让带家见识一下我的 sb 程度((
- 判断形如 a⋅b+c(c≪a⋅b) 是否爆
int
/long long
时,不能只判断 a\cdot b,要判断 a\cdot b+c,因为 c 有可能是压死骆驼的最后一根稻草。 - 线段树节点要维护一大堆东西的时候,通常查询时返回节点,此时空节点与非空节点合并时不能想当然,要特判。
set
/map
等高级的 STL 容器一般很耗内存,ML 小的时候注意会不会爆,爆的话改成自己写的简单一点的 DS。- 不能因为答案在
long long
范围内就忘取模;模数不能抄错,如 10^9+7 抄成 998244353 或 10^9+9。 - 一大堆
min
/max
/abs
时括号位置不能矬,可以用高亮检查。 - 不要胡乱将整型塞进有关 \log 的浮点函数里,可能会玄学爆精度。
- 维护一堆操作的题,如果维护的时候需要用到操作数 qu,那么不能
while(qu--)
而要for(int i=1;i<=qu;i++)
。 - 若 it 是一个指针,要将它位移 a-b 位的话,要写
it+(a-b)
而非it+a-b
,那样可能会越界。 - 尽量不要将多个相关的函数写进一个表达式里,这样运算顺序可能是 UB。
- 把
continue
写成break
/return
。 - 平衡树里上传时要更新
sz
而不能只顾更新其他信息。 - 看清楚数据范围,不要因为 n,q 同阶就认为它们相等,代码中写错变量上限而数组开小会 RE;或未注意到根据题意,数组大小应该是 2n 或其他关于变量上限的式子,而直接写变量上限。
- 多测
memset
,爆零两行泪。 - 网格上的题要看清楚给定的是顶点坐标还是格子坐标。
- 开数组的时候把各数据范围弄混,如将
int a[N+1];
写成int a[X+1];
。 - 前缀和预处理时如果
i=0
则不能调用Sum[i-1]
,可以手动平移一位或特判;同时注意调用前缀和时的越界问题(理论上越界合法,值为 0)。 - 快读不能忘了可能会有负数。
- 如果想退出多重循环,一个
break;
是不行的,只能退出一层。 - 如果算法要求某个数组有序,而且这个数组靠直觉看也应该是本身就是有序的,但是题目可能偏偏不保证有序,而样例却又都是有序的。这时需要排序。
- two-pointers 的时候,如果要对某个数组从大到小扫,那么「将此数组从大到小排序」和「从后往前扫」中只能恰好选一个,如果两个都选就负负得正了。
- 手写队列、栈等时,
head
/tail
/top
的++
/--
是前置还是后置要想清楚。 - 0 没有逆元。讲大一点就是如果一个运算有或没有逆运算那还好说,如果在值域里面有些值可逆,有些值不可逆,那就要当心了。
- 多测清空的最终目的是让每一次跑都如同第一次一样。有的时候光清空解决不了问题,比如下一个点依赖于上一个点的某些数据,而你却把它修改了,这时要还原。所以要把
//remember to clear
改成//remember to make it first
。 - 注意极端数据(边界)。
- 循环变量重复定义(
-Wall
也不会提醒),可能导致看似的灵异事件。比如处在一个很大的for(i)
里面而忘记这层大循环,在里面循环变量也从i
开始。 - 忘判无解。
- 带有减法和取模的题,最终不能忘了把答案转成非负数。
min
/max
的两个参数类型千万不能不相同,可能在某些编译器下通过,但在最终评测编译器下就会悲惨的 CE。- n,m/h,w 混淆。
- 单调队列最好先
push
再pop
,否则可能新加进来需要被pop
的元素。 - 逻辑运算符 & 位运算符优先级。
- 尽管离散化后值域大小等于 n,但如果中途改变了 n,值域大小可就不再等于 n 了。
- 有时候循环内部调用
a[i-1]
并且循环从 1 开始,这时候虽然大多数时候因为a[0]=0
不会有问题,但有的时候就是会冲突,不能欠考虑。 - 下标从 0 开始还是从 1 开始?
- 中间结果爆
ll
而输入输出不会爆。 - 一个待输入变量还没输入就调用。
- 全局变量和局部变量重名,不会报错,但是会调到怀疑人生。(和第 25 条原理相似)
- 初始化函数写了一定要调用啊………………
1<<x
中若 x>31 会爆int
,要写1ll<<x
。- 通常对值域为 \N_+ 的东西,会使用零值来表示没有值。但有的时候值域为 \N,这时候用 0 就会出现错误,需要用 -1。甚至有的时候值域会是 \Z,这时候要用 \infty。
- 离散化忘记
unique
,只sort
,这样正确性没影响,但是数据一大就会 T。 - 浮点转整型以及整型下的除法都是向零取整,如果想要下取整要分类讨论,如
toint
函数应该写int(x+sgn(x)*.5)
instead ofint(x+.5)
。 - 负值跟某些我们希望是
signed
的unsigned
(如v.size()
)作比较会自动转成unsigned
而出错,这时应该把式子里所有unsigned
都强转成signed
。 - 不会用
memset
就不要乱用(指填 size 处)。 - 数据有时会保证在 1e9 以内,并且要求对 998244353 取模,此时要注意到 998244353<10^9,需要手动取模(但是 1e9 + 7 不会出现这样的问题/px)。
珍爱生命,远离抄袭!
分类:
。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core GC计划阶段(plan_phase)底层原理浅谈
· .NET开发智能桌面机器人:用.NET IoT库编写驱动控制两个屏幕
· 用纯.NET开发并制作一个智能桌面机器人:从.NET IoT入门开始
· 一个超经典 WinForm,WPF 卡死问题的终极反思
· ASP.NET Core - 日志记录系统(二)
· 在外漂泊的这几年总结和感悟,展望未来
· 博客园 & 1Panel 联合终身会员上线
· 支付宝事故这事儿,凭什么又是程序员背锅?有没有可能是这样的...
· https证书一键自动续期,帮你解放90天限制
· 在 ASP.NET Core WebAPI如何实现版本控制?