EricQian 2021-08-04 11:57 原文
记录一些 sb 错误
- 离散化的最小值 \(val_0\) 应该赋值为不可能达到的值( \(val_0=-\infty\) )
- 函数传参数从右到左,在
f(rd(),rd())
后会反过来。
- 连续的
if
中记得加上 else
。因为在 if
中可能会改变下一个 if
的判断条件(如某一次洛谷月赛)
- 数组不要开小啦!好多次了,看到一个 \(n\) 的范围就将 \(m\) 的范围也开成 \(n\) 的范围。
- 可能取模的题目中实时取模!(又犯了一次,如 NOIP2021 T2)
- 手写
bitset
时移位操作为 (1llu<<((1llu*i-1llu)%64llu))
,不要忘了 llu
!!!
- 输入尽量不要用
%c
,可以用 %s
代替。
- 拓扑排序时,要将整张图中入度为 \(0\) 的点全部加入,以保证能遍历整张图(即使我们不需要遍历其中一些点)(如 NOIP 函数调用)
- 当要求给浮点数赋值为 \(\infty\) 时,不要用
0x3f3f3f3f
,要用 2000000000
之类。
- 1 不是素数!!!
- 一些需要懒惰标记的题目中用
laztag,lazval
分别来表示是否有标记、标记信息,不要只使用一个 lazval
同时维护是否有标记。
set
和 sort
的 <
一定要是有严格的偏序关系,也就是说必须满足传递性,必须不满足自反性,也就是说不能既 a<b
又 b<a
。
- 多测清空时,记住如果需要访问下标为
n+1
的地方,记得把第 n+1
位也清空(如某一场 CF 比赛)
- 树剖路径修改时关注信息在点上还是在边上,这决定了是否要在
lca
处再次处理。
- 输入时不要在数组中放
rd()
函数!可能会出一堆 Ub,如 mp[rd()][rd()]=rd();
是错误的!
- 合并两个点的时候记得判读他们是否已经处在同一个集合中。
- 没有线段树等奇怪操作时(
define
是暴力展开,会让复杂度假掉)可以将 \(\max\) 和 \(\min\) 用 define
减小常数。
- 珂朵莉树、FHQ 等
split
一个区间时要先分裂右区间再分裂左区间,因为 rank
在分裂后会对后面的数产生影响。
- 内外层变量重名了。(好像可以用
-Wshadow
报 Warning
)。
- 可撤销并查集的秩是深度,启发式合并需要的是大小。
- 有的时候做题需要特判一些取模情况,如在 \(\bmod p\) 时输出 \(2\),不能直接
puts("2")
,要 printf("%d\n",2%p)
。
- 三个 \(<998244353\) 的数相加相减会爆
int
,如 ans=(ans-sum+mod)%mod
可能会导致爆 int
。
- 模数看错,如
1e9+7
看成 998244353
。
- 在倍增跳
lca
时判断是否会跳到 \(0\)!(如 P7834 Peaks 加强版)
- 数组长度是 \(n\) 还是 \(m\)??这是问题
- 当 \(x\) 超过
int
时,调用 __builtin_popcount(x)
会出问题,需要使用 __builtin_popcountll(x)
。
- 对于字符串长度,如果长度为 \(3\) 不能只开到 \(3\),至少开到 \(4\) 或 \(5\),首先是下标 \(0\),其次字符串末尾会自动天上
\0
导致空间 \(+1\)。
- 当在比赛中想去测试点分治的时候,不要将各个测试点的代码写在一起!(由于为了
subtask3
把 subtask1
丢了)update on ZJOI Day 1 T2
推荐阅读