记录一些 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\)。